使用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

使用rssh创建一个安全的文件服务器的更多相关文章

  1. 使用socket编程实现一个简单的文件服务器

    使用socket编程实现一个简单的文件服务器.客户端程序实现put功能(将一个文件从本地传到文件服务器)和get功能(从文件服务器取一远程文件存为本地文件).客户端和文件服务器不在同一台机器上. pu ...

  2. 「两」创建一个带 ssh 镜座服务(修订版)--采用 Dockerfile 创

    创建目录 首先,创建一个叫做 sshd_ubuntu 的目录,用于存放我们的 Dockerfile .脚本文件.以及其它文件. $ mkdir sshd_ubuntu $ ls sshd_ubuntu ...

  3. 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用

    由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...

  4. 用html5的canvas和JavaScript创建一个绘图程序

    本文将引导你使用canvas和JavaScript创建一个简单的绘图程序. 创建canvas元素 首先准备容器Canvas元素,接下来所有的事情都会在JavaScript里面. <canvas ...

  5. 搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 (1)

    搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 原文地址(英文):http://www.networkcomms.net/creating ...

  6. ASP.NET Core管道深度剖析(2):创建一个“迷你版”的管道来模拟真实管道请求处理流程

    从<ASP.NET Core管道深度剖析(1):采用管道处理HTTP请求>我们知道ASP.NET Core请求处理管道由一个服务器和一组有序的中间件组成,所以从总体设计来讲是非常简单的,但 ...

  7. 5分钟创建一个SpringBoot + Themeleaf的HelloWord应用

    第一步:用IDE创建一个普通maven工程,我用的eclipse. 第二步:修改pom.xml,加入支持SpringBoot和Themeleaf的依赖,文件内容如下: <?xml version ...

  8. 如何创建一个简单的Visual Studio Code扩展

    注:本文提到的代码示例下载地址>How to create a simple extension for VS Code VS Code 是微软推出的一款轻量级的代码编辑器,免费,开源,支持多种 ...

  9. 如何用Unity创建一个的简单的HoloLens 3D程序

    注:本文提到的代码示例下载地址>How to create a Hello World 3D holographic app with Unity 之前我们有讲过一次如何在HoloLens中创建 ...

随机推荐

  1. 在唯一密钥属性“fileExtension”设置为“.”时,无法添加类型为“mimeMap”的重复集合项

    在ASP.NET 网站的配置文件中添加了MIME类型,但是运行网站后在IIS上和页面上提示"在唯一密钥属性“fileExtension”设置为“.woff”时,无法添加类型为“mimeMap ...

  2. PHP 面向对象 static 和 self 的区别

    一.前言 php是世界上最好的语言 php从面向过程走到现在成熟的面向对象体系, 在php面向对象中,静态变量的调用我们可以用这两个self::method和 static::method, 但是很多 ...

  3. linux epoll用法

    epoll 是 linux 特有的 I/O 复用函数.它是把用户关心的文件描述符事件放在内核的一个事件列表中,故而,无须像select和poll一样每次调用都重复传入文件描述符或事件集.但是, epo ...

  4. 散列--数据结构与算法JavaScript描述(8)

    散列 散列是一种常用的数据存储技术,散列后的数据可以快速地插入或取用. 散列使用的数据结构叫做散列表. 在散列表上插入.删除和取用数据都非常快,但是对于查找操作来说却效率低下,比如查找一组数据中的最大 ...

  5. 笔记-python-调试

    笔记-python-调试 一般在pycharm下调试或使用log查看输出日志,有时小程序不想这么麻烦,也有一些方便使用的调试方式可以使用. 1.      idle调试 1.打开Python shel ...

  6. salt 通信及其安全

    salt 通信及其安全 模型架构 server-agent通信模型: server就是salt master; agent就是salt-minion salt也可以作为一个单点服务器管理工具使用,或者 ...

  7. android singleTop 不起作用

    今天,排查问题,发现设置了singleTop 的activity, 多次启动依然是多个acitivity,而不是一个. 明明在清单里面设置了,但是就是启动了多个. 可能是因为启动的太快,导致系统判断有 ...

  8. android MotionEvent

    getAction() 获取事件的类型,这是一个组合值,由pointer的index值和事件类型值组合而成的 getActionMasked() 获取事件的类型,不具有其他信息 参考: http:// ...

  9. java 解析/读取 种子/bt/torrent 内容

    碰到不会的技术问题,我还是先度娘.能中文看懂,为什么非要看英文呢. java 解析/读取 种子/bt/torrent  内容,这个度娘给的满意答案并不是很多.GG之后的搜索结果出现了stackover ...

  10. 《Cracking the Coding Interview》——第13章:C和C++——题目5

    2014-04-25 19:59 题目:C的关键字volatile有什么用? 解法:搞硬件设计的人好像更关注这个关键字.volatile本身是易变的意思,应该和persistent有反义词关系吧.说一 ...