分类 运维 下的文章

增强VPS SSH账号安全:改端口,禁用Root,密钥登录,Denyhosts防暴力攻击

VPS SSH账号是我们日常管理VPS的主要登入方式,尤其是Root账号,对Linux系统安全至关重要。以前好多站长喜欢用Putty中文版,这实际是别人修改官方Putty汉化而来,这些软件被植入了后门,导致好几个有名的站点信息泄露,损失惨重。

如何知道自己的VPS账号正在遭受坏人的扫描和暴力破解呢?简单的方法就是查看日志:cat /var/log/auth.log。如何来增强VPS SSH账号的安全性呢?除了养成使用正规软件的好习惯外,还要从VPS本身来加强VPS SSH账号的安全性。

默认的SSH端口都是22,通过修改自己的VPS的端口先为扫描者增加一道端口门槛,VPS默认的账号是Root,如果我们禁用了Root,那么要攻破账号又得先暴力猜测VPS的账号,难度又增加几分。如果还不放心,我们可以直接禁用密码登录验证VPS的方式,改用密钥登录,这样安全系数是相当高了。

Linux还有一个自动统计VPS登录错误工具:Denyhosts,一旦登录VPS账号错误次数超过了Denyhosts安全设置,Denyhosts就会将该IP记录下来,同时将其放入黑名单当中,禁止该IP在某一段时间内继续访问VPS,通过Denyhosts可以实现自动封锁恶意IP。

VPS主机和网站安全优化是一个持久的问题,没有一劳永逸的“安全设置”,道高一尺,魔高一丈,我们只有不断地发现问题,才能最大限度地保护自己网站和VPS安全:

  • 一、增强VPS SSH账号安全方法一:修改SSH登录端口

    • 1、用下面命令进入配置文件。
      vi /etc/ssh/sshd_config

    • 2、找到#port 22,将前面的#去掉,然后修改端口 port 123(自己设定)。

    • 3、然后重启ssh服务。
      /etc/init.d/ssh restart

  • 二、增强VPS SSH账号安全方法二:使用密钥登录SSH

    • 1、SSH登录方式有账号+密码和密钥两种形式,为了阻止暴力破解VPS的账号和密码,我们可以放弃密码验证的方式,改用密钥文件验证。

    • 2、执行以下命令在VPS上生成密钥文件。
      ssh-keygen -t rsa

    • 3、生成密钥时会询问你密钥保存的位置,默认即可,还有你可以为你的密钥还设置一个密码,默认为空。

    • 4、密钥生成后,进入密钥存放的目录中,执行以下命令,将公钥生成一个新的文件。
      cat id_rsa.pub >> authorized_keys

    • 5、将id-rsa这个私钥文件下载到本地,打开PuTTYGen软件,执行Conversions->Import Key,导入这个私钥文件。

    • 6、Putty使用密钥登录SSH方法:如果你要使用Putty,在PuTTYGen中选择Save private key,这时会在本地生成一个PPK文件。

    • 7、然后在Putty中填入服务器名,在SSH授权方式中选择密钥,导入刚刚保存的PPK文件。

    • 8、使用Xshell通过密钥登录VPS方法:如果要使用Xshell,请在PuTTYGen的Conversions中选择Export Open#SSH Key,设置一个名称保存。

    • 9、然后启用Xshell,填入服务器IP,在用户身份验证中选择“Public Key”,然后浏览导入刚刚你保存的Key文件。

    • 10、导入了Key后,你就可以直接打开登录VPS了,不需要输入密码,即可进入VPS。

    • 11、有了密钥登录VPS,我们就可以禁止用密码登录这种验证方式了,还是编辑配置:vim /etc/ssh/sshd_config,添加一行:PasswordAuthentication no,如果有了这一行,请把yes改成no,保存,重启SSH服务,生效。

  • 三、增强VPS SSH账号安全方法三:禁用Root账号

    • 1、如果你已经设置SSH密钥登录的方式,就可以禁用Root账号了,或者你可以新建一个VPS账号。执行以下命令:
      useradd freehao123 #添加用户名

passwd freehao123 #为freehao123用户名设置密码

    • 2、然后编辑进入配置:vim /etc/ssh/sshd_config,找到PermitRootLogin yes,然后后面的Yes改no,如果没有这一行命令,直接将PermitRootLogin no 加进去。

    • 3、保存后,重启SSH服务,生效。

    • 四、增强VPS SSH账号安全方法四:Denyhosts防暴力攻击

      • 1、Linux各平台现在基本上都可以直接安装Denyhosts了,执行以下命令:
        ×Debian/Ubuntu:

    sudo apt-get install denyhosts
    ×RedHat/CentOS
    yum install denyhosts
    ×Archlinux
    yaourt denyhosts
    ×Gentoo
    emerge -av denyhosts

    • 2、安装好了Denyhosts,默认的配置基本上就可以防御一定的暴力攻击了,/etc/hosts.deny 文件里保存了被屏蔽的记录。

    • 3、如果你要自定义Denyhosts的相关配置,执行:vim /etc/denyhosts.conf,以下是相关参数的说明:
      SECURE_LOG = /var/log/auth.log #ssh 日志文件,它是根据这个文件来判断的。

    HOSTS_DENY = /etc/hosts.deny #控制用户登陆的文件
    PURGE_DENY = #过多久后清除已经禁止的,空表示永远不解禁
    BLOCK_SERVICE = sshd #禁止的服务名,如还要添加其他服务,只需添加逗号跟上相应的服务即可
    DENY_THRESHOLD_INVALID = 5 #允许无效用户失败的次数
    DENY_THRESHOLD_VALID = 10 #允许普通用户登陆失败的次数
    DENY_THRESHOLD_ROOT = 1 #允许root登陆失败的次数
    DENY_THRESHOLD_RESTRICTED = 1
    WORK_DIR = /var/lib/denyhosts #运行目录
    SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS=YES
    HOSTNAME_LOOKUP=YES #是否进行域名反解析
    LOCK_FILE = /var/run/denyhosts.pid #程序的进程ID
    ADMIN_EMAIL = [email protected] #管理员邮件地址,它会给管理员发邮件
    SMTP_HOST = localhost
    SMTP_PORT = 25
    SMTP_FROM = DenyHosts
    SMTP_SUBJECT = DenyHosts Report
    AGE_RESET_VALID=5d #用户的登录失败计数会在多久以后重置为0,(h表示小时,d表示天,m表示月,w表示周,y表示年)
    AGE_RESET_ROOT=25d
    AGE_RESET_RESTRICTED=25d
    AGE_RESET_INVALID=10d
    RESET_ON_SUCCESS = yes #如果一个ip登陆成功后,失败的登陆计数是否重置为0

    • 五、增强VPS SSH账号小结

      • 1、上面讲到了四个方法来增强VPS SSH账号的安全性,那么如何得知自己的VPS曾经或正在遭受账号暴力破解登录呢?执行以下命令,查询出来的结果中包含了“ip地址=数量”就是攻击者信息。
        cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2"="$1;}'

      • 2、目前在Putty官网上没有看到中文版本的Putty,所以网上流行的一些汉化版本的Putty很有可能被植入了后门,大家在使用时一定要特别留心。Xshell官网直接提供了多国语言,包括中文在内。

    利用脚本备份vps上网站数据的到dropbox网盘

    看到有人用dropbox备份网站数据,所以今天也试了一下,记得以前是一个python脚本,这是用的是bash 脚本,利用dropbox的api来上传下载的,很方便,脚本的地址是Dropbox-Uploader/dropbox_uploader.sh at master · andreafabrizi/Dropbox-Uploader · GitHub ,感谢作者分享这个脚本。
    因为网速慢,也懒得截图,所以直接贴的文字,大家将就下吧。

    • 第一步:下载dropbox_uploader.sh
      可以到git下载,地址为:https://github.com/andreafabrizi/Dropbox-Uploader

    或者也可以直接拷贝代码,保存为dropbox_uploader.sh,注意拷贝的时候最好是复制到文本编辑器里面,如notepad++之类的
    将dropbox_uploader.sh,我这里上传到/home目录下

    • 第二步:配置dropbox_uploader.sh和创建dropbox app
      首先要修改将dropbox_uploader.sh为可执行的,命令如下:

    chmod u+x /home/dropbox_uploader.sh //这里后面写将dropbox_uploader.sh的存放路径,最好是绝对路径
    sh /home/dropbox_uploader.sh //开始配置dropbox_uploader.sh
    运行后会有下面的提示(我这没截图,所以直接从shell脚本里调出这段提示文字);
    This is the first time you run this script."
    `Please open this URL from your Browser, and access using your account:
    -> https://www2.dropbox.com/developers/apps`
    `If you haven't already done, click \"Create an App\" and fill in the
    form with the following data:`
    App name: MyUploader78878788

     `App type: Core` 

    Permission type: App folder or Full Dropbox
    Now, click on the \"Create\" button.
    When your new App is successfully created, please type the
    App Key, App Secret and the Access level:
    意思很简单,你因为是第一次运行这个dropbox_uploader.sh,所以先要创建dropbox app,然后才能上传文件。
    当然前提是你必须有个dropbox的账号了,没有就自己注册个,反正免费的。
    用浏览器进入创建dropbox app的地址:https://www2.dropbox.com/developers/apps
    进入后点击 Create an app 的按钮
    有三个app选择,这里我们选择 第三个,即名字叫做”Core“
    App name这行输入刚才脚本提示的,我这里是MyUploader78878788
    下面的Permission type,任选一个,我选择的是Full Dropbox
    然后点击右下角的 create app,第一次创建app会要求验证邮箱,所以会发送一封验证邮件到你的注册邮箱,验证之后,以后创建app就不用再验证了
    创建好app之后,就会得到 App Key和 App Secret,按照脚本要求输入对应的key和secret,回车,就会有一些提示,让你确认是输入的信息是否正确,英文很简单,都看的懂的,我也懒得截屏了。
    其中最后一步很关键,会有提示:
    `Please visit this URL from your Browser, and allow Dropbox Uploader
    to access your DropBox account:
    --> https://www2.dropbox.com/1/oauth/authorize?oauth_token=sjfooijiu87
    Press enter when done...`
    这一步就是要求你进入:https://www2.dropbox.com/1/oauth/authorize?oauth_token=sjfooijiu87 这个地址去给 dropbox_uploader.sh关联和访问你创建的app的权限,打开这个网址,你点击允许就可以了。
    然会回到命令行,回车,整个脚本配置过程就结束了。
    第三步:用dropbox_uploader.sh将网站的备份文件长传到dropbox
    命令也不是很多,用法也简单,一些参数如下:
    Usage: ./dropbox_uploader.sh COMMAND [PARAMETERS]...
    Commands:
    upload [LOCAL_FILE/DIR] <REMOTE_FILE/DIR> //上传参数
    download [REMOTE_FILE/DIR] <LOCAL_FILE/DIR> //下载参数
    delete [REMOTE_FILE/DIR] //删除参数
    move [REMOTE_FILE/DIR] [REMOTE_FILE/DIR] //移动
    mkdir [REMOTE_DIR] //在dropbox创建文件夹
    list <REMOTE_DIR> //显示dropbox的文件列表
    share [REMOTE_FILE] //共享dropbox的指定文件
    info //查看你的dropbox的容量使用情况,用户名
    unlink //这个就是解除脚本和app的关联和授权
    我就就简单的举个例子,我将all.www.tar.gz备份到dropbox的根目录,命令为ksharpdabu.tar.gz,命令如下;
    sh /home/dropbox_uploader.sh upload all.www.tar.gz ksharpdabu.tar.gz
    我这整个博客的文件和数据打包压缩有114MB,上传没用一分钟就搞定了,所以对于个人博客还是很方便的。
    其实结合计划任务使用更好,加入 contab,外加增量备份,就更完美了,我这就懒得举例了,我一个博客打包压缩才114M,所以直接才用了完全备份。

    发现写完后,别人早就写过一篇了,算了,反正我没看别人的文章自己按照作者的脚本弄的,都写完了,不可能删了。

    来源:http://www.ksharpdabu.info/site-data-backup-using-the-script-to-dropbox.html

    用Tiny Tiny RSS 搭建自己的rss订阅网站教程

    因为我的vps上已经部署了LNMP的环境,所以,我只需要将Tiny Tiny RSS的网站源码上传到网站根目录,配置下数据库和域名就可以使用了。以下是我的步骤。

    • 第一步:先到DNS商那里添加个二级域名,我这里用的A记录,指向我的vps。我用的是DNSPod的服务,所以,我先去dnspod那里添加我为rss网站设定的二级域名——rss.pcwuyu.com。

    • 第二步:在vps的lnmp下新建一个nginx的虚拟机,添加一个名为rss/的目录作为rss网站的根目录,这个根据自己的情况设定。然后将这个网站根目录与刚才添加的二级域名(即rss.pcwuyu.com)绑定好。

    • 第三步:新建一个数据库,tiny tiny rss支持两种数据库:mysql和postgresql。我用的是mysql,我这里新建一个叫做rss的数据库。创建的方法大家自己选,不熟悉的可以用phpmyadmin,熟悉的就直接用mysql命令吧,
      Mysql> CREATE DATABASE rss //在登陆mysql后输入一下命令创建数据库

    注意:其实,tiny rss 不一定要单独创建一个数据库,他也可以和别的网站共享数据库,但是为了方便管理,我们最好单独创建一个,毕竟rss订阅的数据量还是很大的。

    • 第四步:到Tiny Tiny rss官网下载网站程序源码
      #wget –c https://github.com/gothfox/Tiny-Tiny-RSS/archive/1.9.tar.gz

    将下载的网站源码包Tiny-Tiny-RSS-1.X.X.tar.gz复制到网站的根目录,我这里就是我创建的rss/目录。

      1. 解压网站源码包,命令如下:
        #tar zxfv Tiny-Tiny-RSS-1.X.X.tar.gz

      1. 进入解压后的Tiny-Tiny-RSS-1.X.X/目录,将里面的所有文件拷贝到网站根目录,命令如下:
        #cd Tiny-Tiny-RSS-1.X.X/ //进入刚刚解压的Tiny-Tiny-RSS-1.X.X/目录

    #cp –Rp * rss/ //这里根据自己的根目录的绝对路径来写,我这里假设我的根目录就是rss/

    • c.用浏览器打开,rss.pcwuyu.com,就会看到网站的安装界面,要求你填入数据库名称,数据库用户名,数据库密码等。正确输入后,确认,就会自动安装。
      注意:安装的时候,会有部分文件的权限要求,比如说cache目录下的一些文件夹要求777权限,我们根据提示来设定就可以了。

    • d.会提示你是否初始化数据库,我这里选择是,然后一切都装好了。清除浏览器换从,重新打开rss.pcwuyu.com,然后就会看到网站的登陆界面,默认账号是:admin,密码是password。

    • f.然后进偏好设置(preference)里面修改一些设置,更具自己的需求来设置,比如,我们肯定要进行的操作就是修改管理员的密码,偏好设置里面有个user,里面可以增加和删除网站的用户,分配用户权限等。还有最重要的那就是导入你的opml文件。

    • 导入自己的rss文件后,最重要的一步就是设置让网站程序自己更新rss信息,方法如下:
      因为程序开发这为了安全,所以禁止以root身份运行update.php这个更新rss信息的php脚本,所以,我们要用非root身份来设置crontab计划任务。

    #useradd ksharpdabu //新建一个叫ksharpdabu的用户
    #su ksharpdabu //切换账号到ksharpdabu
    $crontab -e //新建crontab计划任务

    • 将下面的代码粘贴到crontab 文件里面
      */30 * * * * /usr/bin/php /home/rss/update.php --feeds --quiet //这里设置的每隔30分钟更新一次rss信息

    注意:
    /usr/bin/php :这里是php绝对路径,为了安全才这么写的。如果你嫌麻烦,可以直接写成下面的形式:
    */30 * * * * php /home/rss/update.php --feeds --quiet
    /home/rss/update.php : 指的是网站根目录下的update.php文件,这里一定要写这个文件的绝对路径。

    至于rss的更新时间频率,自己可以修改,就是crontab的命令使用,大家自己谷歌,我这里就不详细讲解了。

    --feeds --quiet :这个是update.php的参数,想知道update.php有哪些参数,可以使用下面的命令(不能用root身份运行):
    $php /home/rss/update.php

    提示可用参数如下:
    Options:
    --feeds - update feeds
    --feedbrowser - update feedbrowser
    --daemon - start single-process update daemon
    --task N - create lockfile using this task id
    --cleanup-tags - perform tags table maintenance
    --quiet - don't output messages to stdout
    --log FILE - log messages to FILE
    --indexes - recreate missing schema indexes
    --update-schema - update database schema
    --convert-filters - convert type1 filters to type2
    --force-update - force update of all feeds
    --list-plugins - list all available plugins
    --help - show this help
    Plugin options:
    --update_self - update tt-rss installation to latest version

    • 1.插件地址:http://tt-rss.org/redmine/projects/tt-rss/wiki/Plugins

    • 2.tiny tiny rss 主题下载安装教程地址:http://tt-rss.org/redmine/projects/tt-rss/wiki/Themes

    • 3.升级tiny tiny rss:(升级网站程序的时候,建议禁止第三方的主题)
      Upgrading Tiny Tiny RSS

    It is highly recommended to temporarily disable any third party themes and user CSS customizations before upgrading. Don't forget to empty your browser cache if you experience weird bugs right after upgrading.
    Note that you should upgrade to the latest version available, installing intermediate releases sequentially is not needed.
    In-place upgrading
    The recommended way is in-place upgrading using the updater plugin. There are several specific requirements for updater to work: the user you run updater as should have writable access both to tt-rss and tt-rss parent directories on your web server.
    For example, if tt-rss is installed at /var/www/tt-rss, both /var/www and /var/www/tt-rss need to be writable by the updater user.
    In case of web updater, the user is whatever your site runs PHP under (for example, www-data). In case of CLI updating, you can easily run the plugin as an arbitrary user.
    Please note that updater renames your old tt-rss directory and replaces it with a pristine new one. You will need to copy all locally modified files (e.g. plugins, CSS themes, modified templates, .htaccess files) back from the previous installation (it will be renamed as tt-rssXXXXX in a parent directory). The only exception to this are feed icons and config.php which are copied into the new directory automatically.
    Warning: Third party plugins you have been using might not be compatible with the newer tt-rss version. If you experience crashes right after upgrading, start with disabling all third party plugins to see if that resolves it.
    Warning: In 1.7.6 in-place updater requires CURL. It will fail with RC=2 when CURL functions are not present in PHP.
    Warning: Do not copy cache/ directories from your old tt-rss directory after upgrading.
    You will need to enable the updater plugin by adding it to PLUGINS directive in config.php if it's not enabled yet.
    Afterwards, go to Preferences -> Update Tiny Tiny RSS and follow instructions.
    You can also update from the command line if you have PHP CLI access by running update.php --update_self.
    Proceed to section 3.
    Manual upgrading
    If, for some reason, you are unable to use the in-place updater or updating from an older version which doesn't have it yet, proceed with manual upgrade.
    Download the new archive from tt-rss.org. Unpack it. Replace your old tt-rss directory with a newer one, optionally copying config.php, contents feed-icons, and your other modified files - plugins, CSS files, etc.
    Warning: Third party plugins you have been using might not be compatible with the newer tt-rss version. If you experience crashes right after upgrading, start with disabling all third party plugins to see if that resolves it.
    Proceed to the next section.
    Merging new config.php directives and updating the database
    After the files have been upgraded by newer versions, open tt-rss. It may complain about missing directives in config.php. If that happens, you will need to either merge new stuff from config.php-dist to your config.php or remove config.php and rerun the installer (take note to copy previous value of FEED_CRYPT_KEY if you have feeds with authentication enabled).
    Warning: DO NOT INITIALIZE DATABASE when upgrading. This will remove ALL your tt-rss data.
    Afterwards, you may be redirected to the database updater. Log in with admin credentials and follow instructions.
    Finishing that, you should be able to use tt-rss normally by logging in with your normal account.
    Post-upgrade tasks

    1. You might need to clear your browser cache if you experience CSS or script-related issues, older scripts might have stuck in it.

    2. Do not copy cache directories from your old tt-rss version, it is unnecessary and potentially creates problems if you don't preserve file modification times.

    3. If you are using an accelerator like php-apc you might need to restart apache if older cached versions of PHP files got stuck in cache (this happens rarely, but is a possibility).

    Screen使用小议

    很多时候我们会遇到这样的情况,一个任务需要运行很长时间,例如编译某个庞大的软件包,或者运行更新软件包如:apt-get upgrade 等等。每当这个时候,我们被迫一直开启一个ssh客户端的链接,以便观察任务执行的状态、进行下一步操作等等。如果这个时候你的PC机需要关机或者重启,那么对于我们来说可能是个很痛苦的选择,因为一旦ssh连接断开后,想了解任务执行的情况就非常困难了!

    这就是我今天向大家推荐Screen这个软件包的原因,这个软件包可以说是一个虚拟shell环境工具。你可以在你登录到服务器之后,用这个工具创建一个虚拟的shell环境,在这个环境中工作,可以完全不用考虑断开连接对你的影响。下面我介绍一下Screen的基本使用方法。

    首先是安装。大部分的发行版中都默认安装了这个包,检验你的系统中是否有这个包,可以敲命令:
    screen -list
    如果你的系统中有这个包,将会输出:
    No Sockets found in /tmp/screens/S-root.
    `如果没有这个包,那么输出可能是:
    -bash: screen: command not found`
    如果没有这个包的话,可以自行安装:
    如果你使用Ubuntu的话:apt-get install screen
    如果你使用CentOS的话:yum install screen
    你也可以到Screen的官方网站去下载软件包

    安装了Screen之后,你就可以享受他给你带来的方便了。
    首先,用你的ssh客户端登录你的服务器。在提示符(#或者$)下输入:
    screen -S MyScr (其中“MyScr”是你为这个虚拟shell环境起的名字,可以自定义)
    输入回车之后,你就可以在这个虚拟的shell环境中工作了,你工作的内容都会被一直保留下来。试试吧,在里面敲几个命令,运行几个程序,和平常没有两样吧~~
    如果想要退出要怎么办呢?只要按下Ctrl+A,然后按d,就可以退出刚刚建立的虚拟shell环境了(名字是MyScr)
    若干时间后,你又想继续刚才的工作了,只要再敲:
    screen -r MyScr
    就可以看到刚刚的界面了。怎么样,还是很简单适用的吧,呵呵。

    当然,你不给这个虚拟shell环境命名也是没问题的,如果只有一个虚拟环境的话,也可以这样用
    screen(回车)
    工作……退出……
    screen -r
    继续工作
    系统还会默认用PID号码表识screen虚拟的shell环境。
    例如,我直接用screen命令建立了一个虚拟环境,退出之后,我想查看虚拟环境的情况:
    screen -list
    输出应该是类似下面的:
    There is a screen on:

      `  25202.pts-1.firewallX   (Detached)`

    1 Socket in /tmp/screens/S-root.
    其中:
    “25202”是这个虚拟环境的PID。不信的话,可以ps查看一下,呵呵~
    “pts-1”是说你的ssh客户端登录的系统端口号是pts-1
    “firewallX”是我这台主机的名字
    如果你建立了很多虚拟环境,又没有为他们命名的话,就只能用PID来识别他们了。(记住这个PID号码太烦了吧,还是名字好!)
    例如,我现在有两个screen建立的虚拟环境,我输入:
    screen -list
    输出为:
    There are screens on:

        `25202.pts-1.firewallX   (Detached)`
       ` 25403.pts-1.firewallX   (Detached)`

    2 Sockets in /tmp/screens/S-root.
    那么,我如果想进入第二个虚拟环境的话,我可以用什么命令呢?答案如下:
    screen -r 25403
    如果我登录进去之后,用ctrl-a c再创建一个新的虚拟Shell环境,那么这个环境就是在PID为25403的虚拟环境里面的子虚拟环境。

    参考资料:
    http://www.gnu.org/software/screen
    http://linuxtoy.org/archives/screen.html (其中一些命令可能已经改变了功能)

    最新文章

    最近回复

    分类

  • 默认分类 (24)
  • 运维 (53)
  • docker (1)
  • 动漫 (19)
  • 科普知识 (15)
  • 苍白边缘 (16)
  • 资源 (12)
  • Linux (58)
  • Arch Linux (19)
  • 计算机 (18)
  • 编程 (3)
  • Java (4)
  • python (0)
  • php (0)
  • 前端 (1)
  • 公告 (1)
  • 归档




      其它