【菜鸟不菜系列】Linux 基础教程:第十章:Linux 安全与加固

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

:warning: 如果你还没验证密钥能登录成功,千万别先关密码登录,不然会把自己锁在门外!


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:暴力破解终结者

:red_question_mark: 它是干嘛的?

简单说,fail2ban 会盯着系统日志看:谁在乱输 SSH 密码?输错超过几次,就自动把他 IP 拉黑,禁止访问。

:white_check_mark: 安装(Ubuntu/CentOS)

Ubuntu:

sudo apt update
sudo apt install fail2ban -y

CentOS:

sudo yum install epel-release -y
sudo yum install fail2ban -y

:rocket: 启动并设置开机自启

sudo systemctl start fail2ban
sudo systemctl enable fail2ban

:hammer_and_wrench: 配置基本规则(以 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

:magnifying_glass_tilted_left: 查看状态和封禁 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

:cross_mark: 解封某个 IP:

sudo fail2ban-client set sshd unbanip 192.168.1.100

10.3.2 auditd:系统的“监控摄像头”

:red_question_mark: 它是干嘛的?

你想知道——

  • 谁删了你的配置文件?
  • 谁偷偷改了系统用户?
  • 谁在半夜搞事情?

那就用 auditd,它能记录几乎所有系统事件。不是那种“模糊记忆”,是真正的证据链。

:white_check_mark: 安装(Ubuntu/CentOS)

Ubuntu:

sudo apt install auditd audispd-plugins -y

CentOS:

sudo yum install audit -y

启动并设为开机启动:

sudo systemctl start auditd
sudo systemctl enable auditd

:man_detective: 举例:监控一个文件有没有被改动

比如你想盯着 /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

:page_facing_up: 查看记录

sudo ausearch -k passwd-watch

这会列出所有触发了监控规则的操作,包括时间、是谁动的、用的什么程序。


:broom: 清除规则(如果你不想监控了)

sudo auditctl -W /etc/passwd

10.3.3 总结与建议

工具 用途 常用命令
fail2ban 阻止 SSH 等暴力破解 fail2ban-client, jail.local
auditd 系统活动监控 auditctl, ausearch

建议实际部署时:

  1. 先配好 SSH 密钥登录
  2. 开 fail2ban 保 SSH
  3. 设 auditd 盯敏感文件(/etc/passwd、sudoers)
  4. 定期查看日志或写脚本自动汇报

到这一步,你的服务器已经有了“防盗门 + 报警器 + 监控录像”,黑客就算闯进来,也会留下脚印。