将 PAM 参数传递给 UFW

Evu*_*vus 3 ssh pam shell-script ufw

在开发服务器上,我想在 ssh 登录后打开特定 IP 地址的所有端口

但是我的 ssh 登录脚本不起作用

#!/bin/sh
if [ "$PAM_TYPE" = "close_session" ]; then                    
 ufw delete from $PAM_RHOST
else                                                          
 ufw allow from $PAM_RHOST
fi
Run Code Online (Sandbox Code Playgroud)

在 /etc/pam.d/sshd

session    optional     pam_exec.so quiet /etc/pam_session.sh
Run Code Online (Sandbox Code Playgroud)

需要信息为什么我的脚本不起作用或/以及如何调试它。

如果我没记错的话,默认情况下 PAM 脚本由 root 运行。

Evu*_*vus 5

好的。我的问题是 $PAM_RHOST 返回主机名而不是 ip。

更正的脚本

#!/bin/sh
ip=$(getent hosts "$PAM_RHOST" | awk '{ print $1 }')
if [ "$PAM_TYPE" = "close_session" ]; then
  ufw delete allow from $ip
else
  ufw allow from $ip
fi
Run Code Online (Sandbox Code Playgroud)

注意:确保 ufw 启用了 IPv6,因为“getent hosts”可以返回 IPv6 或 IPv4

  • +1。作为一个小的改进,我建议使用 `getent hosts "$PAM_RHOST` 而不是 `dig` 命令,因为 `getent` 是查询主机名数据库的标准方式(包括 `/etc/hosts`,而 `dig` 不看着)。 (2认同)