年前买了个VPS,一个月不到就被d了,换IP,没到两天又挂,遂放弃,换了家毛子的。无论美国还是俄罗斯的VPS,都发现暴力破解root密码的信息,如果不是黑客猖獗想找肉鸡,就是可能我用的某些脚本有后门。总之,服务器的ssh安全配置必须得做。
MOTD上的非法尝试登录提示:
There were 120 failed login attempts since the last successful login
tips:配置SSH一定要谨慎,最好VPS买完就改,这样万一出错,重置服务器也不心疼。另外运营商或许会提供网页版的控制台(VNC),如果出错,可以试试在那边恢复。
1. 修改SSH默认端口
改ssh默认的22端口本来是很简单的,但由于ssh登录涉及系统安全,所以要把SELinux
(Centos7内置的安全子系统)和Firewalld
(Centos7的防火墙)的ssh端口都改一下。其实你也可以选择关闭SElinux
和Firewalld
来改端口,不过既然本文是为了加强VPS安全性,这种本末倒置的操作就不提了。
下面以22端口改为2200端口为例,讲下操作。
=== 查看SELinux是否运行 ===
[root@localhost ~]# getenforce
=== 如未启用(返回Disable),启用SELinux ===
[root@localhost ~]# nano /etc/selinux/config
# 配置SELINUX项为enforcing,然后重启
SELINUX = enforcing
[root@localhost ~]# reboot
=== 安装SElinux管理器 ===
[root@localhost ~]# yum -y install policycoreutils-python
=== 为SELinux添加ssh的2200端口 ===
[root@localhost ~]# semanage port -a -t ssh_port_t -p tcp 2200
=== 查查看SElinux修改好没 ===
[root@localhost ~]# semanage port -l | grep ssh
=== 测试是否开启了防火墙(running/not runing)===
[root@localhost ~]# firewall-cmd --state
=== 如未开启,开启firewalld ===
[root@localhost ~]# systemctl start firewalld
[root@localhost ~]# systemctl enable firewalld
=== 查看firewalld运行状态 ===
[root@localhost ~]# systemctl status firewalld
=== 开启防火墙的2200端口 ===
[root@localhost ~]# firewall-cmd --zone=public --add-port=2200/tcp --permanent
=== 更新防火墙 ===
[root@localhost ~]# firewall-cmd --reload
=== 列出防火墙端口,看是否有ports: 2200/tcp ===
[root@localhost ~]# firewall-cmd --list-all
=== 修改ssh配置文件,===
[root@localhost ~]# nano /etc/ssh/sshd_config
# 找到Port 22,取消注释并改成Port 2200
Port 2200
=== 尝试重启SSH服务 ===
[root@localhost ~]# systemctl restart sshd
=== 查看SSH运行状态 ===
[root@localhost ~]# systemctl status sshd
返回 active (running)
表示成功,不成功的话检查配置然后重试。
PS:还有优雅一点的开防火墙方法(修改ssh服务)
===开放ssh服务,添加2200端口===
[root@localhost ~]# firewall-cmd --add-service=ssh --permanent
[root@localhost ~]# firewall-cmd --service=ssh --add-port=2200/tcp --permanent
[root@localhost ~]# firewall-cmd --reload
2. 禁止root登录
- 关闭普通用户的su功能
=== 添加新用户foo,并设定密码 ===
[root@localhost ~]# adduser foo
[root@localhost ~]# passwd foo
=== 禁止非wheel组用户使用su命令 ===
[root@localhost ~]# nano /etc/pam.d/su
# 去下面这行的注释(#),注意不是有trust那行
auth required pam_wheel.so use_uid
=== 切换到foo用户 ===
[root@localhost ~]# su foo
=== 测试foo用户权限 ===
[foo@localhost ~]$ su
su: Permission denied
[foo@localhost ~]$ sudo nano XXX
foo is not in the sudoers file. This incident will be reported.
- 开启foo用户su到root的功能
=== 退出foo用户,回到root用户 ===
[foo@localhost ~]$ exit
[root@localhost ~]#
=== 将foo用户加入wheel组 ===
[root@localhost ~]# usermod -G wheel foo
=== 再次测试foo用户权限 ===
[root@localhost ~]# su foo
[foo@localhost ~]$ su
[foo@localhost ~]$ sudo nano XXX
[foo@localhost ~]$ exit
- 确定foo用户可以密码登录以后,禁止root用户登录
=== 禁止root用户登录 ===
[root@localhost ~]# nano /etc/ssh/sshd_config
=== 去掉PermitRootLogin注释,并将yes改成no ===
PermitRootLogin no
=== 重启ssh ===
[root@localhost ~]# systemctl restart sshd
[root@localhost ~]# systemctl status sshd
3. 设置免密登录
- Mac/linux(以下操作,除非说明均指本地机)
== 生成一对密钥(假设名字为key.vps) ===
ssh-keygen -t rsa -f key.vps
=== 将公钥发送到服务器 ===
ssh-copy-id -i ./key.vps.pub -p 2200 foo@host_ip
=== 设置快捷登录 ===
nano ~/.ssh/config
# 指定服务器登录方式和使用的私钥
host VPS_NAME
Hostname host_ip
Port 2200
User foo
IdentityFile ~/.ssh/key.vps
=== 无密码登录服务器 ===
ssh VPS_NAME
- Windows
Windows没有内置ssh,都是用putty之类的ssh终端软件,下面以我常用的Bitvise SSH Client为例子讲讲Windows的SSH免密登录。
- 打开Bitvise SSH Client,点击打开Client key manager
- 点击
Generate New
(生成Key)然后Export
(导出)
- 选择
OpenSSH
格式,公钥私钥都导出一次
- 打开导出的公钥文件(后缀名为*.pub),复制所有文本
-
登录服务器,把文本粘贴到
~/.ssh/authorized_keys
文件中,如果服务器没有这个文件/文件夹,那就新建出来再粘贴。
=== 创建 ~/.ssh/文件夹和下面的authorized_keys文件 ===
[foo@localhost ~]$ mkdir .ssh
[foo@localhost ~]$ cd .ssh
[foo@localhost .ssh]$ nano authorized_keys
=== 设置正确权限 ===
[foo@localhost ~]$ sudo chmod 700 ~/.ssh
[foo@localhost ~]$ sudo chmod 600 ~/.ssh/authorized_keys
- 退出服务器,把登录的
Initial method
改成publickey
,Client Key 下拉菜单选择刚才生产的那个Key(默认叫Profile 1),然后就可以实现免密登录了。
PS:如果拷贝了公钥仍然不能免密登录,请检查SSH配置
[foo@localhost ~]$ sudo nano /etc/ssh/sshd_config
# 下面两项均要为YES
RSAAuthentication yes
PubkeyAuthentication yes
4. 禁止密码登录
当可以成功使用foo用户免密登录以后,设置禁止密码登录
=== 禁止密码登录 ===
[foo@localhost ~]$ sudo nano /etc/ssh/sshd_config
=== 取消PasswordAuthentication注释,并将yes改成no ===
PasswordAuthentication no
=== 重启ssh并查看状态 ===
[foo@localhost ~]$ sudo systemctl restart sshd
[foo@localhost ~]$ sudo systemctl status sshd