NixOS 安全加固实战:攻击面最小化、AppArmor 与审计

NixOS 安全加固实战:安全加固思维、攻击面最小化(最小服务/用户/暴露)、AppArmor 强制访问控制、安全内核参数与 sysctl、SSH 加固(密钥/速率限制/跳板)、auditd 审计与日志、firejail/沙箱隔离、安全更新与漏洞扫描、加固基线清单、常见陷阱。

引言

NixOS 的声明式配置让安全加固从「改完就漂移」变成「配置即基线」——每一台机器开箱就是一份可审计的加固清单。本文不是罗列「关掉什么」,而是给一套加固思维:先缩攻击面(服务/用户/端口),再上访问控制(AppArmor)、内核与 SSH 加固、审计与日志,最后给一份可以照抄的 configuration.nix 加固基线。

前置:/nixos-configuration/(配置基础)、/nixos-network-firewall/(防火墙与网络)、/nixos-services-containers/(服务声明)。


目录


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 指南

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「nix」更多文章

  1. Nix 源码获取与 fetchers:fetchFromGitHub、哈希与私有源
  2. Nix 构建调试与错误排查:常见错误、trace 与诊断手段
  3. NixOS 虚拟机与集成测试:nixosTest 框架与系统级验证