Linux 基础教程:从零到进阶,成为最强管理员
由 linux.mba「Most Badass Admin」最强管理员社区撰写
第三部分:Linux 高级应用
第十章:Linux 安全与加固
10.1 使用 SELinux 加固系统(CentOS 特有)
10.1.1 什么是 SELinux?
如果说 Linux 是一辆大卡车,那 SELinux 就像是一个特别严格、爱管事的副驾驶,时时刻刻在盯着你有没有违规操作。
SELinux(Security-Enhanced Linux)是一种强制访问控制(MAC)机制,它能控制系统中程序和用户对资源(文件、端口、进程)的访问,比传统的 chmod 和 chown 更细粒度、更硬核。
它由美国 NSA 开发……对,就那个美国国家安全局,听起来就很上纲上线。
10.1.2 SELinux 的工作模式
SELinux 有三种模式,先记住这仨:
模式 | 说明 |
---|---|
enforcing | 强制模式:规则说不行就不行,谁也别想破例(默认) |
permissive | 宽容模式:违规操作允许执行,但会记录下来 |
disabled | 关闭模式:直接关闭 SELinux,就当它不存在了 |
你可以这样查看当前模式:
getenforce
输出可能是这样:
Enforcing
也可以用这个命令看更详细的状态:
sestatus
10.1.3 临时修改 SELinux 模式(重启后会恢复)
比如你在部署某个服务时,SELinux 老是挡你路,你可以这样临时切换模式:
setenforce 0 # 切换为 Permissive 模式
setenforce 1 # 切换回 Enforcing 模式
注意:如果当前是 disabled
状态,这两个命令没用。
10.1.4 永久修改 SELinux 模式(需要重启)
编辑配置文件:
vi /etc/selinux/config
找到这一行:
SELINUX=enforcing
你可以改成:
SELINUX=permissive # 宽容模式
# 或
SELINUX=disabled # 彻底关掉
保存后重启生效:
reboot
10.1.5 常见问题:SELinux 拦住了 Web 服务端口
比如你安装好了 Nginx,但是访问不了网站,防火墙也开了、端口也监听了,这时候很可能是 SELinux 的锅。
你可以查看当前 SELinux 策略是否允许:
semanage port -l | grep http_port_t
如果没有 semanage 命令:
sudo yum install policycoreutils-python-utils
如果你想允许 Nginx 使用非标准端口,比如 8080:
sudo semanage port -a -t http_port_t -p tcp 8080
10.1.6 总结一下
操作 | 命令 |
---|---|
查看当前模式 | getenforce |
临时关闭 | setenforce 0 |
永久修改 | 修改 /etc/selinux/config |
查看端口策略 | semanage port -l |
允许新端口 | semanage port -a -t http_port_t -p tcp 端口号 |
如果你实在搞不定,又是测试环境,不想被 SELinux 阻挠,直接关掉也不是不能接受,只不过正式环境别轻易关。
10.2 配置 SSH 密钥认证与安全设置
10.2.1 为什么要用 SSH 密钥?
默认情况下,我们登录服务器通常用用户名 + 密码。
但这就像是在银行只用一个 4 位数字就能取走你的全部存款。一旦密码被猜到,服务器就裸奔了。
所以我们推荐一种更安全的方式 —— SSH 密钥认证。
这就像多了一道“刷卡+指纹”的双重门禁,甚至你可以禁用掉“密码登录”,一把钥匙走天下。
10.2.2 什么是 SSH 密钥对?
简单说就是:
- 私钥(private key):自己留着,相当于你家钥匙。
- 公钥(public key):贴到服务器上,告诉系统“谁拿这把钥匙可以进门”。
私钥像钱包,掉了会出事;公钥像门牌号,贴哪都不怕。
10.2.3 生成 SSH 密钥对(在客户端上操作)
在你的本地电脑(Windows、Mac、Linux 都可以)运行:
ssh-keygen -t rsa -b 4096
你会看到提示:
Generating public/private rsa key pair.
Enter file in which to save the key (/home/youruser/.ssh/id_rsa):
直接按回车就好,默认保存路径就行。
然后:
Enter passphrase (empty for no passphrase):
这里建议 输入一个密码(不是你系统密码),增加一层保护。
最终会生成两个文件:
~/.ssh/id_rsa
:你的私钥(要保密!)~/.ssh/id_rsa.pub
:你的公钥(可以公开给服务器)
10.2.4 把公钥上传到服务器
假设你要登录的是一台 Ubuntu 或 CentOS 服务器,用户名是 root
,IP 是 1.2.3.4
。
用以下命令上传公钥:
ssh-copy-id root@1.2.3.4
会提示你输入密码,输完之后就完成了!
它会自动把你的公钥追加到服务器上的这个文件:
/root/.ssh/authorized_keys
10.2.5 手动上传(如果没有 ssh-copy-id)
你也可以用 SCP 手动复制:
scp ~/.ssh/id_rsa.pub root@1.2.3.4:/tmp/
然后登录服务器,把它追加到 authorized_keys
:
cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
10.2.6 关闭密码登录(建议配置完成后再关)
登录服务器,编辑配置文件:
vi /etc/ssh/sshd_config
找到这些行,改成如下:
PasswordAuthentication no
PermitRootLogin prohibit-password # 或 no,如果不想用 root 登录
然后重启 SSH 服务:
systemctl restart sshd
如果你还没验证密钥能登录成功,千万别先关密码登录,不然会把自己锁在门外!
10.2.7 加一道防护锁:更改默认 SSH 端口
黑客都知道端口 22 是 SSH 的默认端口。你可以换一个,比如 22222:
vi /etc/ssh/sshd_config
修改这行:
Port 22222
然后打开新端口(比如用 firewalld):
firewall-cmd --add-port=22222/tcp --permanent
firewall-cmd --reload
重启 SSH 服务:
systemctl restart sshd
之后登录方式变成:
ssh -p 22222 root@1.2.3.4
10.2.8 总结一下
操作 | 命令 |
---|---|
生成密钥对 | ssh-keygen -t rsa -b 4096 |
上传公钥 | ssh-copy-id user@ip |
手动添加 | cat id_rsa.pub >> ~/.ssh/authorized_keys |
关闭密码登录 | 修改 sshd_config |
改端口 | 修改 Port ,并开放新端口 |
到这一步,你的服务器登录方式就安全了许多:有钥匙才能进,没有钥匙哪怕有用户名密码也没用。
10.3 安全管理工具
服务器如果不做防护,就跟一个没有锁的门,谁想进都能进。我们介绍两个超实用的安全工具:
fail2ban
:防暴力破解的守门员,连错几次密码?踢出去!auditd
:系统的监控摄像头,谁动了什么文件,都有记录。
10.3.1 fail2ban:暴力破解终结者
它是干嘛的?
简单说,fail2ban
会盯着系统日志看:谁在乱输 SSH 密码?输错超过几次,就自动把他 IP 拉黑,禁止访问。
安装(Ubuntu/CentOS)
Ubuntu:
sudo apt update
sudo apt install fail2ban -y
CentOS:
sudo yum install epel-release -y
sudo yum install fail2ban -y
启动并设置开机自启
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
配置基本规则(以 SSH 为例)
复制一份默认配置来改:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vi /etc/fail2ban/jail.local
找到 [sshd]
这一段,按需修改:
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
maxretry = 5
bantime = 3600
解释一下:
enabled = true
:启用这个规则port = ssh
:监控的是 SSH(默认端口 22)maxretry = 5
:5 次输错密码就封你bantime = 3600
:封你 1 小时(秒)
保存后重启:
sudo systemctl restart fail2ban
查看状态和封禁 IP
sudo fail2ban-client status sshd
输出可能长这样:
Status for the jail: sshd
|- Filter
| |- Currently failed: 2
| |- Total failed: 6
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 192.168.1.100
解封某个 IP:
sudo fail2ban-client set sshd unbanip 192.168.1.100
10.3.2 auditd:系统的“监控摄像头”
它是干嘛的?
你想知道——
- 谁删了你的配置文件?
- 谁偷偷改了系统用户?
- 谁在半夜搞事情?
那就用 auditd
,它能记录几乎所有系统事件。不是那种“模糊记忆”,是真正的证据链。
安装(Ubuntu/CentOS)
Ubuntu:
sudo apt install auditd audispd-plugins -y
CentOS:
sudo yum install audit -y
启动并设为开机启动:
sudo systemctl start auditd
sudo systemctl enable auditd
举例:监控一个文件有没有被改动
比如你想盯着 /etc/passwd
文件,如果谁改了它,立刻记录下来。
添加规则:
sudo auditctl -w /etc/passwd -p wa -k passwd-watch
解释一下:
-w /etc/passwd
:监控这个文件-p wa
:w=写入,a=属性改变-k passwd-watch
:给这条规则起个名字,方便以后查
查看所有监控的规则:
sudo auditctl -l
查看记录
sudo ausearch -k passwd-watch
这会列出所有触发了监控规则的操作,包括时间、是谁动的、用的什么程序。
清除规则(如果你不想监控了)
sudo auditctl -W /etc/passwd
10.3.3 总结与建议
工具 | 用途 | 常用命令 |
---|---|---|
fail2ban | 阻止 SSH 等暴力破解 | fail2ban-client , jail.local |
auditd | 系统活动监控 | auditctl , ausearch |
建议实际部署时:
- 先配好 SSH 密钥登录
- 开 fail2ban 保 SSH
- 设 auditd 盯敏感文件(/etc/passwd、sudoers)
- 定期查看日志或写脚本自动汇报
到这一步,你的服务器已经有了“防盗门 + 报警器 + 监控录像”,黑客就算闯进来,也会留下脚印。