我已经使用资源建立了一个 TACACS+ 服务器和一个 PAM TACACS 客户端可在此处获得。我使用 TACACS+ 对使用 的 Linux 用户进行身份验证pam_tacplus.so
。
当用户通过 SSH 访问 TACACS 客户端计算机(Ubuntu 18.04)时,我的目标是通过 TACACS+ 服务器对用户进行身份验证,并仅允许执行 TACACS+ 服务器配置中批准的 shell 中的命令。
尽管身份验证功能正常,但我在启用 shell 命令授权时遇到了挑战。
这是 tacacs+ 服务器配置/etc/tacacs+/tac_plus.conf
:
group = admingroup {
default service = permit
service = exec {
priv-lvl = 12
}
}
user = test {
member = admingroup
global = cleartext "12345"
}
user = test_user {
global = cleartext "12345"
cmd = ls {
permit .*
}
}
我还在客户端计算机上创建了一个本地用户,其用户名与服务器配置中的相同。
在 PAM sshd 模块中/etc/pam.d
我添加了:
auth sufficient /lib/security/pam_tacplus.so debug server=192.168.95.161 secret=test_123 service=system protocol=tcp
account sufficient /lib/security/pam_tacplus.so debug server=192.168.95.161 secret=test_123 service=system protocol=tcp
session sufficient /lib/security/pam_tacplus.so debug server=192.168.95.161 secret=test_123 service=system protocol=tcp
在 TACACS+ 配置中,我允许 test_user 仅执行ls
命令,但实际上所有命令都可以执行。客户端似乎未授权服务器允许的命令。
有没有办法通过TACACS+实现授权和计费?
答案1
PAM 身份验证发生在特定服务的会话级别,而不是单个 shell 命令。一旦用户被授权使用 SSH 登录服务,单个命令就不会受到 PAM 的限制。
事实上,PAM 模块不能检查单个命令,因为 PAM 仅在登录/注销过程中起作用:此时,您尚未指定任何命令,因此,通过单个命令进行限制的唯一方法是 PAM 可以从 TACACS+ 服务器获取允许的命令列表并将其交给用户的 shell 进程。然而,这会因多种原因而失败:
- Unix 风格的 shell 中没有可供 PAM 使用的通用 API 将有关此类限制的信息传递给 shell。
- 在经典的 Unix 安全模型中,shell 不应该成为普通用户限制的执行者;这是内核的工作。(在普通的 Unix 风格系统中,用户可能能够为自己构建自定义 shell 二进制文件并执行它,并且仍然会受到与其用户帐户和组成员身份相关的内核强制文件权限和资源限制的限制。)
限制:
- 仅支持 TACACS+ 协议的子集;但足以满足大多数需求
普通 shell(例如bash
)在决定是否允许执行命令之前不会检查外部身份验证服务器。虽然可以创建一个 shell,它会针对每个命令查询身份验证服务器,但我不知道有哪个 shell 会对输入的每个命令检查 TACACS+ 授权。
壳bash
确实有一个限制模式这可能与您正在寻找的类似;但是,限制只能在本地配置,而不能由 TACACS+ 服务器配置。
还要注意,这种受限的 shell 必须实现一组非常严格的限制才能有效:没有cd
命令、没有包含斜杠的命令名、没有管道/重定向等。此外,决定允许的命令集是一项不简单的任务:您需要研究您计划允许的每个命令的全部功能,以确保它不包含启动不受限制的子 shell 的可能性,或者以其他方式逃避限制。
由于这些原因,受限 shell 往往难以设置并用于任何非平凡任务,而chroot
对于用户需要 shell 访问权限但必须限制在系统特定部分的情况,可以使用 jail 等其他手段。