引言
NixOS 的声明式配置让安全加固从「改完就漂移」变成「配置即基线」——每一台机器开箱就是一份可审计的加固清单。本文不是罗列「关掉什么」,而是给一套加固思维:先缩攻击面(服务/用户/端口),再上访问控制(AppArmor)、内核与 SSH 加固、审计与日志,最后给一份可以照抄的 configuration.nix 加固基线。
前置:/nixos-configuration/(配置基础)、/nixos-network-firewall/(防火墙与网络)、/nixos-services-containers/(服务声明)。
目录
- 1. 加固思维:先缩攻击面再上防护
- 2. 攻击面最小化:服务用户端口
- 3. AppArmor:进程级强制访问控制
- 4. 内核与 sysctl 加固
- 5. SSH 加固:密钥、限速与跳板
- 6. 审计与日志:auditd 与 journald
- 7. 沙箱隔离:firejail 与 systemd 防护
- 8. 安全更新与漏洞扫描
- 9. 加固基线清单
- 10. 速查表与一句话记忆
- 延伸阅读
1. 加固思维:先缩攻击面再上防护
1.1 攻防的底层逻辑
攻击者的第一步永远是发现入口:开放端口、默认账户、未更新的软件。安全加固的第一原则不是「装更多防护」,而是让攻击者没有入口可打——每减少一个服务、一个端口、一个特权用户,就少一条攻击路径。
1.2 NixOS 的两大先天优势
# 1) 声明式基线:配置即加固,漂移为零
# 2) 只读 store + 不可变系统:篡改文件系统更难持久化
# 3) 升级可回滚:补丁出问题一键回退,敢于及时打补丁
记忆:加固第一原则是「先缩攻击面再上防护」——NixOS 声明式基线 + 只读 store + 回滚能力让加固可落地、可审计、敢打补丁。
2. 攻击面最小化:服务用户端口
2.1 只开必要的服务
默认关闭一切不用的服务,需要什么开什么:
{
# 只启动必要服务,其余默认不启用
services.sshd.enable = true; # 显式开启
# services.nginx.enable = false; # 不声明就不启动
}
2.2 端口最小暴露
配合防火墙只放行白名单端口(见网络专题),服务只监听所需接口:
{
networking.firewall.allowedTCPPorts = [ 22 443 ]; # 只放 22/443
}
2.3 最小特权用户
# 服务用专用低权用户跑(systemd 的 DynamicUser)
# 管理员不用 root 日常操作,用 sudo 白名单
# 用户按需创建,不建"备份账号"等通用账户
记忆:攻击面最小化 = 服务最小(显式启用)、端口白名单(只放 22/443)、用户最小特权(DynamicUser + sudo 白名单)。
3. AppArmor:进程级强制访问控制
3.1 AppArmor 是什么
AppArmor 是进程级 MAC(强制访问控制):给每个程序一个策略(profile),规定它能读/写/执行哪些路径、能绑哪些端口——即使进程被攻破,也走不出策略边界。
3.2 启用 AppArmor
{
security.apparmor.enable = true;
security.apparmor.killUnconfinedConfinables = true; # 无策略的已知程序默认拒绝
}
3.3 写一个简单 profile
{ lib, pkgs }:
let
# 自定义 profile:限制某程序只读系统配置
myAppProfile = pkgs.writeText "myapp.apparmor" ''
profile myapp /run/current-system/sw/bin/myapp {
# 只读系统配置与公共库
/etc/myapp/* r,
/usr/lib/** r,
# 只能写自己的数据目录
/var/lib/myapp/* w,
}
'';
in
{
security.apparmor.profiles = { myapp = { profile = myAppProfile; }; };
}
记忆:AppArmor 是进程级 MAC——策略限定程序可访问的路径/端口,进程被攻破也走不出边界;enable + killUnconfinedConfinables 起步,再按需加 profile。
4. 内核与 sysctl 加固
4.1 常见内核加固参数
{
boot.kernel.sysctl = {
# 禁止 IP 转发(非路由器)
"net.ipv4.ip_forward" = 0;
# 禁 ICMP 重定向(防路由投毒)
"net.ipv4.conf.all.accept_redirects" = 0;
"net.ipv6.conf.all.accept_redirects" = 0;
# 随机化 TCP 时间戳(防序列号预测)
"net.ipv4.tcp_timestamps" = 1;
# 限制核心转储(防凭据泄露)
"kernel.core_uses_pid" = 1;
# 禁止 drm 模块加载(按需)
"kernel.dmesg_restrict" = 1;
};
}
4.2 安全相关内核模块
# 加载内核安全模块(按需)
# apparmor(见上)、safesetid、landlock 等
# 收紧默认文件权限:boot.kernelParams 加 "noexec" 等(谨慎,避免破坏系统)
记忆:内核加固走 sysctl 白名单式声明——禁 IP 转发/ICMP 重定向/限制 core dump/dmesg,NixOS 里 boot.kernel.sysctl 即配置即生效。
5. SSH 加固:密钥、限速与跳板
5.1 SSH 加固要点
{
services.openssh = {
enable = true;
settings = {
# 只允许密钥登录
PasswordAuthentication = false;
PermitRootLogin = "no";
# 只允许指定用户
AllowUsers = [ "alice" "bob" ];
# 禁止转发 X11(默认即可)
X11Forwarding = false;
};
};
}
5.2 速率限制与日志
{
# 用 systemd 限制 SSH 尝试频率(配合 fail2ban 或 sshguard)
services.fail2ban.enable = true;
services.fail2ban.maxretry = 5; # 5 次失败封禁
}
5.3 跳板与密钥管理
# 生产服务器只通过跳板机 SSH 进入,阻断直达
# 密钥放安全存储(age/sops),不进明文配置
# 定期轮换密钥并审计登录日志(见下)
记忆:SSH 加固三板斧——密钥登录禁密码、禁 root 直登、AllowUsers 白名单;fail2ban 限速防爆破;跳板机阻断直达 + 密钥托管安全存储。
6. 审计与日志:auditd 与 journald
6.1 启用 auditd
auditd 记录系统调用级的事件(谁在什么时候改了哪个文件、执行了什么命令):
{
security.audit.enable = true;
security.audit.rules = [
"-a always,exit -F arch=b64 -S execve -k cmd_exec" # 记录所有命令执行
"-w /etc/nixos/ -p wa -k nixos_config" # 监控配置目录改动
];
}
6.2 journald 加固
{
# 持久化日志 + 限容量
services.journald.extraConfig = ''
Storage=persistent
SystemMaxUse=1G
MaxRetentionSec=30day
'';
}
6.3 查看审计
ausearch -k cmd_exec # 按规则查询命令执行
ausearch -m USER_LOGIN # 查看登录事件
journalctl -u sshd --since today # SSH 日志
记忆:审计三件套——auditd 记录系统调用级事件(命令执行/文件改动规则化)、journald 持久化日志限容量、ausearch/journalctl 查询;加固没有审计等于没加固。
7. 沙箱隔离:firejail 与 systemd 防护
7.1 systemd 服务防护
给每个服务加防护指令,把「可逃逸面」收窄:
{
systemd.services.myservice = {
serviceConfig = {
# 沙箱:只读文件系统 + 私有 /tmp
ProtectSystem = "strict";
PrivateTmp = true;
PrivateDevices = true;
# 拒绝提权与能力
NoNewPrivileges = true;
CapabilityBoundingSet = [ "" ];
};
};
}
7.2 firejail 浏览器等高风险程序
{
# firejail 给图形/浏览器程序做沙箱(网络/文件隔离)
programs.firejail.enable = true;
}
记忆:沙箱隔离两层——systemd 服务加 ProtectSystem/PrivateTmp/NoNewPrivileges 收窄逃逸面,firejail 给浏览器等高风险程序做文件/网络隔离。
8. 安全更新与漏洞扫描
8.1 及时更新 + 可回滚
# NixOS 的优势:更新即快照,回滚即还原
# 订阅安全公告(NixOS security-tracker)
# 定期 nixos-rebuild switch 到最新稳定版
8.2 漏洞扫描
{ pkgs, ... }:
{
environment.systemPackages = [ pkgs.vulnix ]; # 扫描 store 中包的安全漏洞
}
vulnix 2>/dev/null | grep "CVE" # 输出已知 CVE
记忆:安全更新靠「及时 rebuild + 一键回滚」的组合(敢打补丁不怕坏);漏洞扫描用 vulnix 对照 store 里包的 CVE——更新与扫描要进巡检清单。
9. 加固基线清单
9.1 一份可照抄的基线
{ config, pkgs, ... }:
{
# 1) 攻击面最小化
networking.firewall.enable = true;
networking.firewall.allowedTCPPorts = [ 22 443 ];
# 2) AppArmor
security.apparmor.enable = true;
security.apparmor.killUnconfinedConfinables = true;
# 3) 内核 sysctl(节选)
boot.kernel.sysctl."net.ipv4.ip_forward" = 0;
# 4) SSH 加固
services.openssh.settings.PasswordAuthentication = false;
services.openssh.settings.PermitRootLogin = "no";
# 5) 审计与 fail2ban
security.audit.enable = true;
services.fail2ban.enable = true;
# 6) 日志持久化
services.journald.extraConfig = "Storage=persistent";
}
9.2 上线前检查清单
☐ 只暴露必要端口(防火墙白名单)
☐ 无默认/通用账户,root 禁 SSH
☐ 只开必要服务,禁用未用服务
☐ AppArmor 启用且覆盖核心进程
☐ auditd 规则覆盖命令执行与配置改动
☐ 日志持久化 + 容量限制
☐ 更新到最新稳定版 + vulnix 无高危 CVE
☐ 备份可用(回滚路径验证过)
记忆:加固基线 = 防火墙白名单 + AppArmor + sysctl + SSH 禁密码/禁 root + auditd + fail2ban + 日志持久化;上线前按清单逐项核对。
10. 速查表与一句话记忆
| 加固项 | 手段 | 一句话 |
|---|---|---|
| 攻击面 | 服务/端口/用户最小化 | 无入口可打 |
| 访问控制 | AppArmor | 进程走不出策略边界 |
| 内核 | sysctl 白名单 | 配置即生效 |
| SSH | 密钥/白名单/fail2ban | 禁密码禁 root 限速 |
| 审计 | auditd + journald | 无审计等于没加固 |
| 沙箱 | ProtectSystem/firejail | 逃逸面收窄 |
| 更新 | rebuild + vulnix | 敢打补丁靠回滚 |
一句话记忆:NixOS 安全加固的骨架——先缩攻击面(服务/端口/用户最小化、防火墙白名单),再上访问控制(AppArmor 让进程走不出策略)、内核加固(sysctl 禁转发/重定向/限 core dump)、SSH 三板斧(密钥禁密码/禁 root/白名单 + fail2ban 限速),审计用 auditd 记录命令执行与配置改动、journald 持久化日志;沙箱用 systemd ProtectSystem/PrivateTmp 与 firejail 收窄逃逸面;更新走「及时 rebuild + 一键回滚」,vulnix 扫 CVE——声明式配置让加固从「改完就漂移」变成「配置即基线」,每台机器开箱都是一份可审计的加固清单。
延伸阅读
- /nixos-configuration/ — 声明式配置基础
- /nixos-network-firewall/ — 防火墙、NAT 与 WireGuard
- /nixos-services-containers/ — 服务声明与 systemd
- /nix-secrets-management/ — 密钥托管(sops-nix/agenix)
- /nixos-operations-maintenance/ — 升级回滚与巡检
- [[security]] — 安全加固与攻防实践
- [[devops]] — 基础设施安全运维
- NixOS 安全手册
- NixOS AppArmor 指南
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。