背景
这几天登录服务器root账户发现了上千的登录尝试,而服务器上有重要的隐私文件,升级安全性刻不容缓。
查看主机登录日志
日志存放的地点是/var/log
可以使用以下命令查看
less /var/log/secure
常用日志
日志名称 | 说明 |
---|---|
access-log | 纪录HTTP/web的传输 |
acct/pacct | 纪录用户命令 |
aculog | 纪录MODEM的活动 |
btmp | 纪录失败的纪录 |
lastlog | 纪录最近几次成功登录的事件和最后一次不成功的登录 |
messages | 从syslog中记录信息(有的链接到syslog文件) |
sudolog | 纪录使用sudo发出的命令 |
sulog | 纪录使用su命令的使用 |
syslog | 从syslog中记录信息(通常链接到messages文件) |
utmp | 纪录当前登录的每个用户 |
wtmp | 一个用户每次登录进入和退出时间的永久纪录 |
xferlog | 纪录FTP会话 |
详细指令查看这里
添加新用户
使用自定义的用户登录参考这篇文章。
禁用root账户远程登录
需要编辑/etc/ssh/sshd_config
文件。
找到以下语句
PermitRootLogin yes
如果有#
,则取消注释,修改为
PermitRootLogin no
保存并退出。
重启SSH服务
systemctl restart sshd
使用秘钥登录
以后更新。
修改SSH登录端口
修改/etc/ssh/sshd_config
文件,取消# Port 22
的注释,并在下一行添加想更改成为的端口,例如2222端口Port 2222
Port 22
Port 2222
这里不直接删除Port 22
是因为避免配置中出错而导致彻底无法远程登录。
保存更改后重启sshd
服务
systemctl restart sshd
新开终端,测试连接新端口。
ssh -p 2222 user@255.255.255.255
如果成功连接便可以忽略文章中间的SELinux和Firewalld的配置,直接转到收尾。
配置SELinux
SELinux 全称 Security Enhanced Linux (安全强化 Linux),是 MAC (Mandatory Access Control,强制访问控制系统)的一个实现,目的在于明确的指明某个进程可以访问哪些资源(文件、网络端口等)。
对于SSH,SELinux默认只允许22
端口,我们可以用SELinux管理配置工具semanage
,来修改SSH可访问的端口。
安装 semanage 工具
yum provides semanage
yum -y install policycoreutils-python
打开2222端口
semanage port -a -t ssh_port_t -p tcp 2222
查看当前SELinux允许的SSH端口
semanage port -l | grep ssh
如果显示如下则配置正常。
ssh_port_t tcp 2222, 22
解除禁用
当SELinux配置为禁用状态时,使用semanage
会报错提示无法读取policy
文件。
SELinux: Could not downgrade policy file /etc/selinux/targeted/policy/policy.30, searching for an older version.
SELinux: Could not open policy file <= /etc/selinux/targeted/policy/policy.30: No such file or directory
/sbin/load_policy: Can't load policy: No such file or directory
libsemanage.semanage_reload_policy: load_policy returned error code 2. (No such file or directory).
FileNotFoundError: [Errno 2] No such file or directory
此时需要修改/etc/selinux/config
文件,开启SELinux。
vi /etc/selinux/config
SELINUX=permissive
重启服务器
init 6
查看SELinux状态
sestatus # if it shows disable, you can run$ load_policy -qi
添加SSH端口并检查配置
semanage port -a -t ssh_port_t -p tcp 2222
$ semanage port -l | grep ssh
ssh_port_t tcp 2222, 22
重启SSH服务
systemctl restart sshd
注:semange 不能禁用 ssh 的 22 端口:
semanage port -d -t ssh_port_t -p tcp 22
ValueError: 在策略中定义了端口 tcp/22,无法删除。
配置Firewalld
启用防护墙
systemctl enable firewalld
systemctl start firewalld
检查防火墙状态
- 方法一
systemctl status firewalld
显示如下为正常
firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since 二 2016-12-20 02:12:59 CST; 1 day 13h ago
Main PID: 10379 (firewalld)
CGroup: /system.slice/firewalld.service
└─10379 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
- 方法二
firewall-cmd --state
显示如下为正常
running
查看防火墙当前默认和激活zone(区域)
$ firewall-cmd --get-default-zone
public
$ firewall-cmd --get-active-zones
public
interfaces: eth0 eth1
如果没有激活public区域,需要激活。
激活public区域,增加网卡接口
$ firewall-cmd --set-default-zone=public
$ firewall-cmd --zone=public --add-interface=eth0
success
$ firewall-cmd --zone=public --add-interface=eth1
success
为public zone永久开放2222/TCP端口:
# 以防新端口不生效,先把 22 端口暴露
$ firewall-cmd --permanent --zone=public --add-port=22/tcp
$ firewall-cmd --permanent --zone=public --add-port=2222/tcp
success
# 重载防火墙
$ firewall-cmd --reload
# 查看暴露端口规则
$ firewall-cmd --permanent --list-port
443/tcp 80/tcp 22/tcp 2222/tcp
$ firewall-cmd --zone=public --list-all
public (default, active)
interfaces: eth0 eth1
sources:
services: dhcpv6-client ssh
ports: 443/tcp 80/tcp 22/tcp 2222/tcp
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
测试连接
ssh -p 2222 user@255.255.255.255
收尾
SSH禁用22号端口
修改/etc/ssh/sshd_config
文件,注释掉Port 22
。
重启SSH服务
systemctl restart sshd
查看SSH监听的端口
ss -tnlp | grep ssh
LISTEN 0 128 *:2222 *:* users:(("sshd",pid=2125,fd=3))
防火墙移除22号端口
$ firewall-cmd --permanent --zone=public --remove-port=22/tcp
success
$ firewall-cmd --reload
$ firewall-cmd --permanent --list-port
443/tcp 80/tcp 2222/tcp
其实可以这样。
firewall-cmd --permanen --zone=public --add-forward-port=port=22:proto=tcp:toport=22:toaddr=127.0.0.1
防火墙载入配置后就会将22号端口的流量重定向为访问者本地。
如要删除。
firewall-cmd --permanen --zone=public --remove-forward-port=port=22:proto=tcp:toport=22:toaddr=127.0.0.1
测试
$ ssh -p 22 user@255.255.255.255
无响应,因为转到了本地的 22 端口,若防火墙未 forward 连接,则会回显 "ssh: connect to host {ip} port 22: Connection refused"
$ ssh -p 2222 user@255.255.255.255
成功 success