Linux下通过PAM自动挂载加密的RAID1(LUKS)分区实战指南


阅读 10 次

问题场景描述

最近在配置服务器时遇到一个典型需求:将加密的RAID1阵列(/dev/md0)设置为用户登录时自动挂载。具体环境如下:

# 查看阵列状态
mdadm --detail /dev/md0
# 查看加密状态
cryptsetup status /dev/mapper/data

PAM配置关键点

原始配置中主要存在两个问题:

  1. 设备映射路径/dev/mapper/data在挂载时尚未创建
  2. 密钥文件路径可能需要调整权限

修正后的/etc/security/pam_mount.conf.xml配置示例:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE pam_mount SYSTEM "pam_mount.conf.xml.dtd">
<pam_mount>
  <debug enable="1" />
  <volume
    user="your_username"
    path="/dev/md0"
    mountpoint="/mnt/data"
    fstype="crypt"
    cipher="aes-xts-plain64"
    fskeypath="/etc/keys/data.key"
    options="noatime,nodiratime" />
</pam_mount>

密钥文件安全设置

建议将密钥文件存放在/etc/keys/目录并设置严格权限:

sudo mkdir /etc/keys
sudo chmod 700 /etc/keys
sudo cp ~/data.key /etc/keys/
sudo chmod 400 /etc/keys/data.key

系统服务依赖处理

需要确保服务启动顺序正确,创建/etc/systemd/system/md0-cryptsetup.service:

[Unit]
Description=Cryptography Setup for /dev/md0
After=systemd-cryptsetup@md0.service
Requires=mdmonitor.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/cryptsetup luksOpen /dev/md0 data --key-file /etc/keys/data.key
ExecStop=/sbin/cryptsetup luksClose data

[Install]
WantedBy=multi-user.target

然后启用服务:

sudo systemctl daemon-reload
sudo systemctl enable md0-cryptsetup.service

PAM模块集成

/etc/pam.d/system-auth中添加(适用于RHEL系):

auth    required    pam_mount.so
session optional    pam_mount.so

或在/etc/pam.d/common-session中添加(适用于Debian系):

session optional    pam_mount.so

调试技巧

遇到问题时可以查看详细日志:

# 查看PAM调试信息
journalctl -u systemd-logind -f
# 测试PAM交互
pamtester login your_username authenticate

替代方案参考

如果仍无法解决,可以考虑使用/etc/crypttab方案:

# /etc/crypttab 配置示例
data /dev/md0 /etc/keys/data.key luks

配合/etc/fstab实现自动挂载:

# /etc/fstab 配置示例
/dev/mapper/data /mnt/data ext4 defaults 0 2