Tags: , , , , , , , , , , 100, Posted in 软言软语 我抢沙发

哈,大家好,21经过长时间的“沉没”,在这个寒冷的冬日怎么着也该冒泡泡以表无恙呀~ 话说,今天是二四节气中的“大雪”,够不上下雪条件的昆明便下起了稀里哗啦的雨,让21这个电动车男给冻的 …… 无法用言语形容的呀~

经过近半年时间,21手上开始掌握了一些廉价的VPS进行个人学习和实验,基本配置小至128M OpenVZ大至512M Xen都有,当然,买来以后闲置的时间稍微占多了点,不过由于Hawkhost空间12.6到期的刺激,我把Mr. 2175%都搬迁到其中一个512M Xen VPS上并且进行了相关的配置。本着内存能少用就少用、资源能节约就节约的原则,我进行了一些学习和模仿。

文中涉及到的操作基本上都需要root权限,且,21个人喜欢nano编辑器,如果你喜欢vi,稍微换一下命令就行。

基础调配部分及LNMP

由于21喜欢用Debian,于是参考了VPSee的文章《64MB VPS 上优化 Debian 5》和LowEndBox的《Bootstraping WordPress/Nginx/PHP/MySQL on a Cheap VPS with lowendscript》,对VPS上的OpenSSH、 syslog-ng用Dropbear和inetutils-syslogd进行了替换,从基础上对资源占用进行了控制,大概操作如下:

    OpenSSH、 syslog-ng的替换,我使用了LEB的lowendscript,在root用户下,如此操作便可:

    1
    2
    
    wget http://github.com/lowendbox/lowendscript/raw/master/setup-debian.sh
    bash setup-debian.sh system

    如果你参考这里,会发现LEB的这个脚本其实还可以安装LNMP里面的NMP(Nginx, MySQL, PHP)三个组件,但是我个人比较喜欢国人的LNMP,于是仅使用LES脚本进行了系统组件的替换。

之后,我安装LNMP 0.5(请参考这里)作为WEB服务器,并且进行了一些调整,这个调整请按照自己的需求就好。

  1. 将Nginx的子线程调整为2个,方法如下:
    1
    
    nano /usr/local/nginx/conf/nginx.conf

    找到worker_processes,将其改成下面的样子:

    1
    
    worker_processes 2;

    然后按Ctrl+O保存,按Ctrl+X退出。

  2. 同时,我将PHP-FPM的子线程也调整为2个,方法如下:
    1
    
    nano /usr/local/php/etc/php-fpm.conf

    按Ctrl+W搜索max_children,改成下面这样的格式:

    1
    
    <value name="max_children">2</value>

    然后按Ctrl+O保存,按Ctrl+X退出。再来重启nginx和php-fpm:

    1
    2
    
    invoke-rc.d nginx restart
    /usr/local/php/sbin/php-fpm restart
  3. 关于这个……MYSQL的调优,这个……21表示个人水平不足,就不献丑了。

Fail2Ban调配部分

这是一些比较基础的安全方面的调配。

  1. 首先,是禁用root用户的ssh登录,由于我们已经用Dropbear替换了OpenSSH,所以跟一般教程针对OpenSSH的修改方式不太一样,大概方法如下:
    1
    
    nano /etc/xinetd.d/dropbear

    然后把其中的server_args修改为如下样子

    1
    
        server_args     = -i -g

    让 /etc/xinetd.d/dropbear 配置文件看起来像这样

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    service ssh
    {
        socket_type     = stream
        only_from       = 0.0.0.0
        wait            = no
        user            = root
        protocol        = tcp
        server          = /usr/sbin/dropbear
        server_args     = -i -g
        disable         = no
    }

    然后按Ctrl+O保存,按Ctrl+X退出。
    -g的意思就是禁用root使用密码登录,但可以用公钥登录(public key)(请参考这里)。
    然后重启Dropbear:

    1
    
    invoke-rc.d xinetd restart
  2. 禁用了root账户登录,但是21在某些特定的没有公钥情况下又需要登录SSH,怎么办呢?增加一个普通用户就好了,这个用户不用具备什么特殊权限,只要能登录SSH足矣,大概操作如下:

    1
    
    useradd [username] -p [password]

    [username]替换为你想要的用户ID(注:不能为纯数字),[password]替换为想要的密码便可。
    之后我们以[username]登录系统,然后输入su root,再输入root密码便可以切换到root用户的shell。
    推荐不要使用太简单的ID,比如a/ab/abc什么的,为什么?后面告诉你。

好了,虽然21禁用了root用户的登录,但是还有个无法避免的问题:暴力猜解,如果我们使用了够简单的ID,例如a/ab/abc之类的,那么很容易被锁定为爆破目标,那我就是喜欢a这个ID怎么办呢?好吧,那只好来点稍微强硬点的措施了,21用fail2ban。fail2ban可以监视你的系统或者应用日志,然后匹配日志的错误信息(正则式匹配)执行iptables屏蔽策略,把某IP的包扔掉,fail to ban~

Fail2ban本身已经内置了不少应用的判断规则了

1
2
3
4
5
apt-get install fail2ban //安装fail2ban
ls /etc/fail2ban/filter.d/
apache-auth.conf      apache-overflows.conf  couriersmtp.conf  gssftpd.conf        postfix.conf    qmail.conf      sshd.conf         wuftpd.conf
apache-badbots.conf   common.conf            named-refused.conf  proftpd.conf    sasl.conf       vsftpd.conf       xinetd-fail.conf  apache-noscript.conf
courierlogin.conf     exim.conf              pam-generic.conf    pure-ftpd.conf  sshd-ddos.conf  webmin-auth.conf

但是我们已经把SSH服务换成了Dropbear,把日志服务换成了inetutils-syslogd,那fail2ban会不会水土不服呢?
哈,这简直是必须的~

我们需要做点工作让fail2ban能适应我们这个精简过的系统,适应Dropbear的错误日志。

  1. 首先,Fail2ban需要监视Dropbear的用户登录日志,但是替换成inetutils-syslogd以后,21发现自己的 /var/log/auth.log.1 (没错,我的不是auth.log,是auth.log.1)停滞在某年某月某日了~ 于是稍微看了一下 /var/log/messages 发现里面有我需要的信息,我把它登录信息分离出来方便Fail2ban的读取,如下:

    1
    
    nano /etc/syslog.conf

    默认内容如下:

    1
    2
    3
    
    *.*;mail.none;cron.none -/var/log/messages
    cron.*                  -/var/log/cron
    mail.*                  -/var/log/mail

    增加一个句子将登录信息分离出来,修改为

    1
    2
    3
    4
    
    *.*;mail.none;cron.none -/var/log/messages
    cron.*                  -/var/log/cron
    mail.*                  -/var/log/mail
    authpriv.*              /var/log/auth.log

    到此为止我们拥有了一个单独的包含Dropbear登录信息的日志文件 /var/log/auth.log。

  2. 接下来我们设置Fail2ban,按照常规对SSH进行防御的教程,说的都是针对OpenSSH的设置和判断规则,而显然Dropbear是被遗忘的,甚至Debian的Bug Report里面都有人提到这样的问题,当然,也有人帮忙解决这样的问题,大牛总是有的~

    首先,我们需要下载一个针对Dropbear的判断策略文件,如下:

    1
    
    wget -c "http://bugs.debian.org/cgi-bin/bugreport.cgi?msg=5;filename=dropbear.conf;att=1;bug=546913" -O /etc/fail2ban/filter.d/faidropbear.conf

    然后,在fail2ban的配置里面增加对dropbear的监视和动作:

    1
    
    nano /etc/fail2ban/jail.conf

    按Ctrl+V一直翻页到最下面空白处,增加以下内容

    1
    2
    3
    4
    5
    
    [ssh-iptables]
    enabled  = true
    port = ssh
    filter   = dropbear
    logpath  = /var/log/auth.log

    然后按Ctrl+O保存,按Ctrl+X退出,之后,便是我们的收尾动作了,执行

    1
    
    invoke-rc.d fail2ban restart

完事儿了。

引用参考:
1. Google: http://www.google.com/ncr
2. Debian Bug Report: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=546913
3. LowEndBox: http://www.lowendbox.com/blog/wordpress-cheap-vps-lowendscript/
4. VPSee: http://www.vpsee.com/2009/06/64mb-vps-optimize-debian5/
5. HostingFu: http://hostingfu.com/article/use-dropbear-ssh-to-save-memory
6. Easy Firewall Generator: http://easyfwgen.morizot.net/gen/

- EOF-

December 7, 2010