zoukankan      html  css  js  c++  java
  • 使用rssh创建一个安全的文件服务器

    使用rssh创建一个安全的文件服务器


    目前有这样一个需求,公司需要一台linux服务器作为文件服务器,但是基于安全性考虑,我不想使用ftp或者samba,但又必须允许用户上传文件。怎么办呢?

    因为是linux服务器,所以可以让用户使用ssh登录到服务器上,然后使用sftp功能上传下载文件。

    这样虽然解决了上边的问题,但又带来一个新的问题。

    因为OpenSSH要求登录用户必须有一个可用的shell,用户才可以登录到这台Linux服务器。
    那么势必要给每个用户一个shell,有了shell用户就可以访问你这台服务器的文件系统了!

    那这如何解决这个问题呢?答案是rssh---- 一个受限制的shell

    rssh是一个配合OpenSSH使用的受限shell,这个shell只可以执行下列操作:
    * scp
    * sftp
    * cvs
    * rsync
    * rdist
    除上述操作之外,其他一切操作都是禁止的。

    安装rssh

    CentOS/Fedora/RHEL Linux

    可以直接从Dag源下载rssh安装包
    # cd /tmp
    # wget http://dag.wieers.com/rpm/packages/rssh/rssh-2.3.2-1.2.el5.rf.i386.rpm
    # rpm -ivh rssh-2.3.2-1.2.el5.rf.i386.rpm

    Debian/Ubuntu Linux

    使用apt-get命令安装:
    $ sudo apt-get install rssh

    FreeBSD
    # cd /usr/ports/shells/rssh
    # make install clean

    rssh配置文件如下:

    * 默认配置文件/etc/rssh.conf (FreeBSD - /usr/local/etc/rssh.conf)
    * 默认rssh可执行文件位置/usr/bin/rssh (FreeBSD - /usr/local/bin/rssh)
    * 默认端口无( openssh使用22端口- rssh只是一个安全的shell)

    配置用户帐号使用rssh作为shell

    配置工作非常简单,新建用户使用-s参数直接指定rssh作为用户shell
    # useradd -m -d /home/didi -s /usr/bin/rssh new_user
    # passwd new_user

    如果已存在的用户,可以使用chsh命令或usermod命令来修改用户shell
    # usermod -s /usr/bin/rssh old_user
    或者
    # chsh -s /usr/bin/rssh old_user

    默认情况下rssh禁止用户进行一切访问,我们必须明确指出允许用户进行哪些操作。

    打开/etc/rssh.conf文件,增加可用配置项,可用选项如下。
    * allowscp : 允许执行scp.
    * allowsftp : 允许执行sftp.
    * allowcvs : 允许执行cvs.
    * allowrdist : 允许执行rdist.
    * allowrsync : 允许执行rsync.

    创建Chroot"监牢"

    创建所有必须的目录:
    # mkdir -p /users/{dev,etc,lib,usr,bin}
    # mkdir -p /users/usr/bin
    # mkdir -p /users/libexec/openssh

    创建null文件/users/dev/null:
    # mknod -m 666 /users/dev/null c 1 3

    复制必须的/etc中的文件到/users/etc:
    # cd /users/etc
    # cp /etc/ld.so.cache .
    # cp -avr /etc/ld.so.cache.d/ .
    # cp /etc/ld.so.conf .
    # cp /etc/nsswitch.conf .
    # cp /etc/passwd .
    # cp /etc/group .
    # cp /etc/hosts .
    # cp /etc/resolv.conf .
    编辑/usres/group和/users/passwd文件,删除root和其他所有用户。

    复制必须的可执行文件到/users/bin和其他相应位置:
    # cd /users/usr/bin
    # cp /usr/bin/scp .
    # cp /usr/bin/rssh .
    # cp /usr/bin/sftp .
    # cd /users/usr/libexec/openssh/
    # cp /usr/libexec/openssh/sftp-server .或者 cp /usr/lib/openssh/sftp-server .
    # cd /users/usr/libexec/
    # cp /usr/libexec/rssh_chroot_helper 或者 cp /usr/lib/rssh/rssh_chroot_helper
    # cd /users/bin/
    # cp /bin/sh . 或者 cp /bin/bash .

    复制所有必须的共享库文件

    例如使用ldd命令查看sftp必须的共享库文件如下:

    # ldd /usr/bin/sftp
    linux-gate.so.1 => (0x00456000)
    libresolv.so.2 => /lib/libresolv.so.2 (0x0050e000)
    libcrypto.so.6 => /lib/libcrypto.so.6 (0x0013e000)
    libutil.so.1 => /lib/libutil.so.1 (0x008ba000)
    libz.so.1 => /usr/lib/libz.so.1 (0x00110000)
    libnsl.so.1 => /lib/libnsl.so.1 (0x0080e000)
    libcrypt.so.1 => /lib/libcrypt.so.1 (0x00a8c000)
    libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0x00656000)
    libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0x00271000)
    libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0x00304000)
    libcom_err.so.2 => /lib/libcom_err.so.2 (0x00777000)
    libdl.so.2 => /lib/libdl.so.2 (0x00123000)
    libnss3.so => /usr/lib/libnss3.so (0x00569000)
    libc.so.6 => /lib/libc.so.6 (0x00b6c000)
    libkrb5support.so.0 => /usr/lib/libkrb5support.so.0 (0x00127000)
    libkeyutils.so.1 => /lib/libkeyutils.so.1 (0x00130000)
    /lib/ld-linux.so.2 (0x00525000)
    libplc4.so => /usr/lib/libplc4.so (0x008c9000)
    libplds4.so => /usr/lib/libplds4.so (0x00133000)
    libnspr4.so => /usr/lib/libnspr4.so (0x00d04000)
    libpthread.so.0 => /lib/libpthread.so.0 (0x0032a000)
    libselinux.so.1 => /lib/libselinux.so.1 (0x00341000)
    libsepol.so.1 => /lib/libsepol.so.1 (0x00964000)

    那么你必须把这些输出中的共享库文件复制到"监牢"中的相应目录中。

    修改syslogd配置文件

    syslog如果要工作需要向类似/dev/log这样的FIFO文件中写入数据。
    我们通过-a参数告诉syslog必须额外监听一个socket。
    如果打算让一些守护进程运行在chroot环境中,则这是必须的。
    默认最多可以使用19个附加的socket。如果你确实需要更多,那么可以修改syslogd源码syslogd.c中的MAXFUNIX来实现。

    编辑/etc/sysconfig/syslog文件
    # vi /etc/sysconfig/syslog

    找到如下一行
    SYSLOGD_OPTIONS="-m 0"

    追加/users/dev/log到其后
    SYSLOGD_OPTIONS="-m 0 -a /users/dev/log"

    保存配置文件,然后重起syslog
    # /etc/init.d/syslog restart

    修改rssh.conf,配置chroot路径

    # vi /etc/rssh.conf

    加入下边一行:
    chrootpath=/users

    然后重起sshd
    # /etc/init.d/sshd restart

    将用户投入"监牢"

    和上边提到修改用户shell类似,使用-d参数将新用户的主目录指定到我们新建立的"监牢"中即可。
    # useradd -m -d /users/home/newuser -s /usr/bin/rssh newuser
    # passwd newuser

    然后我们用newuser帐户尝试登陆一下看看.

    sftp newuser@my-server.com
    newuser@my-server.com's password:
    sftp> ls
    sftp> pwd
    Remote working directory: /home/newuser
    sftp> cd /tmp
    Couldn't canonicalise: No such file or directory

    可以看到用户不能访问/tmp目录,因为我们没有在"监牢"中建立这个目录,用户完全被限制在监牢中了。

    Per-user配置
    上边说的配置是针对所有用户的,如果我们针对不同用户有不同的配置要求,那么可以在配置文件中使用user指令。
    user指令的可以覆盖其他一切配置,它的优先级最高。

    举例来说,假如在配置文件中,user指令那一行设定了用户foo的可以执行哪些操作,那么无论其他行如何配置,用户foo的配置也不会改变。

    user指令使用冒号(:)来分隔指令关键词,按照 username:umask:path 的顺序

    * username : 被设定权限的用户名
    * umask : 分为两个部分,
    第一部分是8进制,指定shell访问权限。
    第二部分是5个2进制位,每个位定义一个可执行的操作,1是允许,0是禁止。
    * path : 用户的chroot目录名(如果目录名中有空格,必须用双引号括起来).

    例如用户foo只可以执行cvs操作:

    五个bit位的可执行操作如下

    大家可以用下边的几个例子熟悉一下:
    user=Jhon:011:00100: # cvs, with no chroot
    user=kate:011:01000: # rdist, with no chroot
    user=rudy:011:10000: # rsync, with no chroot
    user=rudy:011:00001:"/usr/local/my chroot" # scp with chroot

    本文参考了以下文档:
    How to: Restrict Users to SCP and SFTP and Block SSH Shell Access with rssh
    How to: Configure User Account to Use a Restricted Shell ( rssh )
    Linux Configure rssh Chroot Jail To Lock Users To Their Home Directories Only
    rssh: Per User Configuration Options For Chroot Jail

  • 相关阅读:
    将10进制数字转成62进制数字(转)
    admin添加用户时报错:(1452, 'Cannot add or update a child row: a foreign key constraint fails (`mxonline`.`django_admin_l
    Django admin 中抛出 'WSGIRequest' object has no attribute 'user'的错误
    分布式爬虫
    Scrapy之CrawlSpider
    Scrapy之Cookie和代理
    Scrapy核心组件
    scrapy之持久化存储
    Scrapy框架的基本使用
    爬虫之request模块高级
  • 原文地址:https://www.cnblogs.com/oskb/p/3848518.html
Copyright © 2011-2022 走看看