服务器初始安全设置(CentOS 6.5)

VPS买来好几个月了,之前因为感觉fail2ban 可能会造成log爆炸就没装,然后仅仅禁了root帐号登录和换了个登录帐号——倒也相安无事,但是那天去/var/log/目录下看log的时候发现每天的登录日志和帐号密码错误信息能塞十几二十M——被人盯上了用机器企图暴力破解,虽然由于猜不到我用户名所以VPS本身不会出事,但是天天被人这么搞也不爽,然后就稍微折腾下。在禁root登录换登陆用户 的基础上又加了几个安全措施:换SSH端口使用ssh密钥文件登录。所以写个文章做个记录——其实文章里有个关于ssh config文件的彩蛋才是我最想推荐的(本文以Centos 6.5为例,具体的文件路径可能不同的linux发行版会有区别。)

因为很重要所以写在最前面:
所有安全措施更新后检测是否生效的时候都不需要关闭当前的ssh term 窗口,直接另开一个就好。当前窗口不要关闭,可以用来在发生某些意外情况下做补救措施(比如换了sshd的端口但是忘记在防火墙里开放端口等)否则就只能去VPS提供商的VNC服务器里去做补救了,比较麻烦

禁用root登录

  1. 新建一个用户并设置密码,如添加一个用户名为test的用户(方便行文下文都会以test作为例子,建议自行替换)

    adduser test #添加用户
    passwd test #会弹出设置密码的提示,输两遍即可
  2. 添加sudo用户组
    目的是为了给新添加的帐号sudo权限,不过每次都手动设置单个帐号比较麻烦,所以建议先直接添加一个免密码的sudo用户组,后续的用户可以一次性添加到该组(另外安全考虑不建议sudo用户组里用户过多)

    visudo

    如果提示visudo: command not found的话,可以用yum -y install sudo安装sudo即可

    然后往下拉找到

    ## Same thing without a password
    # %wheel ALL=(ALL) NOPASSWD: ALL

    去掉下面那个#注释让设置生效然后保存文件退出。

    如果没有找到该内容的话可以自己手动添加进去。另外NOPASSWD:ALL可以让sudo指令免密码,方便的同时降低了一定安全性,所以看个人取好自行决定

  3. 将新建用户添加进sudo
    这样的话后面就不需要每次都切换到root帐号了,需要sudo权限的命令都可以直接通过sudo <command>来执行

    gpasswd -a test wheel

    上面两步的wheel可以自行替换成你喜欢的用户组名。
    具体可参考:how-to-add-and-delete-users-on-a-centos-7-server

设置SSH登录

  1. 生成ssh密钥文件

    Windows系统以putty为例,生成以及配置的图文教程可以参考此文:Putty使用密钥自动登陆SSH
    linux下的密钥生成过程和github的密钥生成过程类似,可以参考此文: git多网站ssh部署方案


  2. 上传公钥到服务器

    • 客户端为Windows系统时服务器端的操作:

      cd /home/test #进入test用户文件夹下
      mkdir .ssh #生成.ssh文件夹
      touch .ssh/authorized_keys #生成服务器端公钥文件
      vi .ssh/authorized_keys

      然后将前面putty生成的公钥部分复制进去后保存文件退出。
      注意openssh需要的公钥文件格式和putty导出保存的公钥文件格式不一样,正确格式是生成框里的那部分,所以不要复制错了

      正确格式:

      ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAxx+1Ab3s5TB4umhxspJA91i2az0QW7JTVBR+J/OYPyjDH803Upxvo
      sg0lDkf7nTmL3nyE6YCBPgQMgT+HvVDDI6CQ68E/ZQOmgNpGo70k+x/C7VkPu8z+5yBXwwI1K5maHqY4B8RIKVCYon
      2eMLhtyLC6U/K1OXaCdz0wR8xwz+rT8REmoCv770yC/FOsgmI250bAvVlqircvLfknlTrETAgaQ8PR9e5pNuoGwX3v
      pCMBnuKjXKQpHvAX1MKFx4UFGC6MIB5Gcq4H9nv9aBUKnWO+m58JF8tAU7KhfkUc2wWG11ON21K3w/gL7dyHPRyLGJ
      yBZRFKBZGr+gzCfrhzw== rsa-key-20160331

    • 客户端为linux系统的话ssh-copy-id指令即可

      ssh-copy-id -i ~/.ssh/id_rsa.pub root@123.123.123.123

      虽然要设置的登录帐号不是root,不过还是建议先传到root用户文件夹下,然后服务器端做转移。(之前试过直接传给对应帐号好像出了点问题,可能是权限之类的)


  3. 使用密钥文件登录
    Windows下使用putty登录的配置参考步骤1的参考文章
    如果有使用其他shell登录需求的可以继续往下看,以git bash为例:
    由于putty的私钥文件不通用,所以需要转换出RSA格式给其他shell用,需要在 PUTTYGEN.EXE 上方菜单里的 Conversions > Export OpenSSH Key 转换成通用的私钥文件,假设文件名为test
    然后将其放到当前用户的C:\Users\username\.ssh目录下.(其实这里的配置过程和git的ssh登录配置过程类似)
    彩蛋:如果目录下有多个密钥网站了,还需要修改同目录下你的ssh配置文件(config文件),添加下面内容:

    Host test #这个名字随意
    HostName 123.123.123.123 #IP地址或服务器域名
    Port 22 #服务器端开放的ssh端口,默认22
    User test#登录的用户名
    IdentityFile ~/.ssh/test #使用的密钥文件密钥文件

    上面这里是完整的ssh配置格式,这么配置后git bash里可以直接用ssh test的方式直接登录,省去了输域名或者ip地址以及用户名的过程,简单不少。(关于ssh config文件的配置具体可以参考此文:How To Configure Custom Connection Options for your SSH Client)

    PS:登录这个步骤是比较容易出错的,如果服务器端配置有问题的话。建议服务器端先将sshd的log level开到debug3:
    vi /etc/ssh/sshd_config后修改LogLeveldebug3
    然后保存退出并service sshd restart重启ssh服务.接着客户端执行登录操作,如果有错误的话,less /var/log/secure打开登录的log文件拉到最底下查看对应问题。
    以我个人配置经验来看,失败的话一般无外乎以下几个原因:、

    1. key的位置不是默认的~/.ssh/而是./home/{username}/.ssh/(这里有个细节在于即使sshd_config配置AuthorizedKeysFile .ssh/authorized_keys,由于linux系统的~表示当前用户的根目录,所以非root用户的key路径依旧是对应的home/username文件夹下而不是root根目录)
    2. key对应的文件夹给700权限,key本身至少400权限保证可读
    3. authorized_keys文件的用户组要设置为对应的用户组,否则读取不了
    4. 在某些服务商的 CentOS 系统里,由于开启了 SELinux ,默认是禁止了 .ssh 目录的权限的,可以用下面的命令解除限制:
      restorecon -R -v /root/.ssh

SSH其他配置

如果上面ssh密钥登录设置完成了,为了最后的安全,我们还需要做三件事:

  1. 禁止密码登录
  2. 禁止root用户登录
  3. 修改SSH默认端口
    由于以上三个都是sshd_config里的东西,所以合一起讲:
    修改以下三个属性保存并重启SSH即可

    PermitRootLogin no
    PasswordAuthentication no
    Port 65525

    修改端口后需要注意,大部分VPS应该都默认开了防火墙,所以需要防火墙里把对应端口开放,否则会无法登录

    iptables -I INPUT -p tcp --dport 65525 -j ACCEPT
    service iptables save
    service iptables restart

参考文献

  1. how-to-add-and-delete-users-on-a-centos-7-server
  2. Putty使用密钥自动登陆SSH
  3. git多网站ssh部署方案
  4. How To Configure Custom Connection Options for your SSH Client
  5. 购买 Linux VPS 服务器后简单的安全设置