VPS买来好几个月了,之前因为感觉fail2ban
可能会造成log爆炸就没装,然后仅仅禁了root帐号登录和换了个登录帐号——倒也相安无事,但是那天去/var/log/
目录下看log的时候发现每天的登录日志和帐号密码错误信息能塞十几二十M——被人盯上了用机器企图暴力破解,虽然由于猜不到我用户名所以VPS本身不会出事,但是天天被人这么搞也不爽,然后就稍微折腾下。在禁root登录
、换登陆用户
的基础上又加了几个安全措施:换SSH端口
、使用ssh密钥文件登录
。所以写个文章做个记录——其实文章里有个关于ssh config
文件的彩蛋才是我最想推荐的(本文以Centos 6.5为例,具体的文件路径可能不同的linux发行版会有区别。)
因为很重要所以写在最前面:
所有安全措施更新后检测是否生效的时候都不需要关闭当前的ssh term 窗口,直接另开一个就好。当前窗口不要关闭,可以用来在发生某些意外情况下做补救措施(比如换了sshd的端口但是忘记在防火墙里开放端口等)否则就只能去VPS提供商的VNC服务器里去做补救了,比较麻烦
禁用root登录
新建一个用户并设置密码,如添加一个用户名为
test
的用户(方便行文下文都会以test
作为例子,建议自行替换)adduser test #添加用户passwd test #会弹出设置密码的提示,输两遍即可添加
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指令免密码,方便的同时降低了一定安全性,所以看个人取好自行决定将新建用户添加进
sudo
组
这样的话后面就不需要每次都切换到root帐号了,需要sudo权限的命令都可以直接通过sudo <command>
来执行gpasswd -a test wheel上面两步的
wheel
可以自行替换成你喜欢的用户组名。
具体可参考:how-to-add-and-delete-users-on-a-centos-7-server
设置SSH登录
生成ssh密钥文件
Windows系统以
putty
为例,生成以及配置的图文教程可以参考此文:Putty使用密钥自动登陆SSH
linux下的密钥生成过程和github的密钥生成过程类似,可以参考此文: git多网站ssh部署方案
上传公钥到服务器
客户端为Windows系统时服务器端的操作:
cd /home/test #进入test用户文件夹下mkdir .ssh #生成.ssh文件夹touch .ssh/authorized_keys #生成服务器端公钥文件vi .ssh/authorized_keys然后将前面putty生成的公钥部分复制进去后保存文件退出。
注意openssh需要的公钥文件格式和putty导出保存的公钥文件格式不一样,正确格式是生成框里的那部分,所以不要复制错了正确格式:
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAxx+1Ab3s5TB4umhxspJA91i2az0QW7JTVBR+J/OYPyjDH803Upxvosg0lDkf7nTmL3nyE6YCBPgQMgT+HvVDDI6CQ68E/ZQOmgNpGo70k+x/C7VkPu8z+5yBXwwI1K5maHqY4B8RIKVCYon2eMLhtyLC6U/K1OXaCdz0wR8xwz+rT8REmoCv770yC/FOsgmI250bAvVlqircvLfknlTrETAgaQ8PR9e5pNuoGwX3vpCMBnuKjXKQpHvAX1MKFx4UFGC6MIB5Gcq4H9nv9aBUKnWO+m58JF8tAU7KhfkUc2wWG11ON21K3w/gL7dyHPRyLGJyBZRFKBZGr+gzCfrhzw== rsa-key-20160331
客户端为linux系统的话
ssh-copy-id
指令即可ssh-copy-id -i ~/.ssh/id_rsa.pub root@123.123.123.123虽然要设置的登录帐号不是root,不过还是建议先传到
root
用户文件夹下,然后服务器端做转移。(之前试过直接传给对应帐号好像出了点问题,可能是权限之类的)
使用密钥文件登录
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端口,默认22User 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
后修改LogLevel
为debug3
然后保存退出并service sshd restart
重启ssh服务.接着客户端执行登录操作,如果有错误的话,less /var/log/secure
打开登录的log文件拉到最底下查看对应问题。
以我个人配置经验来看,失败的话一般无外乎以下几个原因:、- key的位置不是默认的
~/.ssh/
而是./home/{username}/.ssh/
(这里有个细节在于即使sshd_config
配置AuthorizedKeysFile .ssh/authorized_keys
,由于linux系统的~
表示当前用户的根目录,所以非root用户的key路径依旧是对应的home/username
文件夹下而不是root根目录) - key对应的文件夹给700权限,key本身至少400权限保证可读
authorized_keys
文件的用户组要设置为对应的用户组,否则读取不了- 在某些服务商的 CentOS 系统里,由于开启了
SELinux
,默认是禁止了 .ssh 目录的权限的,可以用下面的命令解除限制:restorecon -R -v /root/.ssh
- key的位置不是默认的
SSH其他配置
如果上面ssh密钥登录设置完成了,为了最后的安全,我们还需要做三件事:
- 禁止密码登录
- 禁止
root
用户登录 修改SSH默认端口
由于以上三个都是sshd_config
里的东西,所以合一起讲:
修改以下三个属性保存并重启SSH即可PermitRootLogin noPasswordAuthentication noPort 65525修改端口后需要注意,大部分VPS应该都默认开了防火墙,所以需要防火墙里把对应端口开放,否则会无法登录
iptables -I INPUT -p tcp --dport 65525 -j ACCEPTservice iptables saveservice iptables restart