linux · sshd pam · 2013-09-25 · yuex

某今年新入了一台 linode 主机,最便宜的 plan,年中的时候,linode 流量从 2GB 免费升级到了 2TB。因为某的博客是直接放到 github 上的,所以对 linode 的使用一直都不怎么充分。仅限于几个朋友之间的 L2TP 和自己的 ssh -D。一直都有一个架立一个 socks 伺服的想法,来给大家免费用。无奈于大部分的浏览器都不支持有密码的 socks 认证,如果架设一个没有验证的伺服又有很严重的管理和用户性能区分保证的问题,所以这个想法一直没有落实。今天花了一些时间,用 ssh+pam+chroot jail 完成了这个想法,将思路大概记录一下,希望对有同样需求的同学有所帮助。

ssh+pam+chroot 各模块的功能如下

  • ssh/sshd:client and server,支持密码用户
  • pam:提供基于用户名和 ip 地址段的登陆认证和限制
  • chroot:做成一个 chroot jail 限制用户在主机上的权限

chroot jail

在 sshd 中添加

Match Group groupname
    ChrootDirectory /path/to/jail

这会使得 groupname 的用户在登陆 ssh 之后,会自动被 chroot 到管理员定义的 jail 到中,这里以 /path/to/jail 为例。这只是办了入狱手续,还要真正的建立监狱才行。chroot 之后,会自动调用 bash,要保证在这个路径下,bash 可以正常使用。只要用 ldd 解析一下 bash 的依赖,然后将所以依赖放到这个路径下就可以了。监狱制成之后,要自己 chroot 体验 验证一下。

ssh

ssh 的问题主要是客户端。linux 和 mac 用户就不用说了,ssh -D 可以直接参考 manpage,还不会的就去面壁吧。windows 下可以使用 putty,并且 putty 可以事先设置好,直接分发给用户。用户先建立 ssh 连接,再用浏览器 socks 连接到本地绑定的端口。更进一步可以通过安装浏览器插件来根据规则自动地应用 socks,比如 chrome 上可以使用 Proxy Swichy

pam

pam 有两方面的作用,一个是提供基于用户和地址的登陆验证,一个是限制用户使用系统资源。对于资源限制,主要是防止 fork bomb 和限制登陆数目。这两个都可以在 /etc/security/limits.conf 中完成。其实在 centos6 当中,对于 fork bomb 系统有防范,可以参考 /etc/security/limits.d/,这个值是 1024。另外,对于写的权限控制,最简单的方法是把 jail 建立在 /var 来解决,/var 对非 root:root 的用户是没有写的权限的。对于登陆验证,需要在 sshd_config 中打开 UsePam yes,并且在 /etc/pam.d/sshd 中加入

account    required     pam_nologin.so
account    required     pam_access.so  # <- added line
account    include      password-auth

此外还要在 /etc/security/access.conf 中写入具体的登陆控制,可以参考其中的 comments,支持用户和 ip 区分。注意这两个文件都是顺序解析的,First Come Firs Serve。所以要注意写入规则的顺序。

对于这样建立的 socks 伺服并非没有问题,比如 bandwidth 的限额。