delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

11 Sep 2006

作弊条:如何限制ssh验证的cvs/svn用户权限

传统上,SCM系统的用户登录有两种方式,一种是通过启动自己对应的服务,如cvs的cvs pserver或svn的svnserve、Apache DAV等等,而另一种方式是ssh,即不启动服务,而使用ssh来完成身份认证工作,如果通过,则通过ssh远程启动对应的服务,如cvs server和svnserve。

后一种方法存在一个很明显的问题,即需要给用户开放一个shell权限,这样一来,用户便有机会登录到repository上进行一些我们不希望的操作(原则上,SCM系统是不应绕过的,这属于管理员的特权操作)。于是,一个显而易见的解决方法,便是通过ssh自己提供的key限制功能来加以限制,不过这种方法是有问题的,即同一IP上,每个key只能绑定一种服务。

另一种方法是由FreeBSD.org采用的cvs wrapper,并使用这个wrapper作为shell。然而这个方法也并非理想,因为它同样存在服务器绑定的问题。

如果希望能够使用一个ssh实例提供多个不同的SCM系统,还可以使用一种方法,那就是利用sendmail内建的smrsh(8)程序。这个程序最初设计是用来为作为sendmail过滤器的程序提供一个受限的shell,其原理是只允许执行指定目录(默认为/usr/libexec/sm.bin)中的程序。这样,就可以将它(/usr/libexec/smrsh)作为用户的默认shell,并提供所需的服务,而又完全禁止用户直接登录了。

具体操作如下:

  1. 将smrsh加入允许的shell列表。这是chsh(1)所需要的操作:
    echo /usr/libexec/smrsh » /etc/shells

  2. 建立需要的程序的连接到指定目录:

ln -s /usr/bin/cvs /usr/libexec/sm.bin/
ln -s /usr/local/bin/svnserve /usr/libexec/sm.bin/

  1. 将用户的shell改为/usr/libexec/smrsh

  2. 测试

需要说明的是,这并不是一个完美的解决方法。更为精细的访问控制,还需要使用其它一些辅助手段来实现。