使用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. ajax原生js及readystate/status

    菜鸟教程 ←← GET: <script> function  ajaxGet(){ var  xmlhttp; if(window.XMLHttpRequest){ //TE7+  Fi ...

  2. TA-LIB】之MACD

    移动平滑异同平均线(Moving Average Convergence Divergence,简称MACD指标)策略.MACD是查拉尔·阿佩尔(Geral Appel)于1979年提出的,由一快及一 ...

  3. 使用windows api安装windows服务程序(C#)

    3个步骤: 1.安装器代码编写 2.安装器工具类编写 1)安装.启动服务) 2)卸载服务 3.windows服务程序编写(参考:多线程.方便扩展的Windows服务程序框架) 4.代码下载,在文末(注 ...

  4. laravel通过make auth实现手机号登录

    首先按照Laravel的教程,安装认证系统. php artisan make:auth php artisan migrate laravel已经安装完成认证系统,默认注册和登录都是用邮箱. 如果想 ...

  5. Google Compute Engine VM自动调节

    现象:利用google云搭建VM服务,在搭建实例组有一个"自动调节"功能,可以自动添加/删除MV,当自动添加VM时可能新添加的VM就是一个新的VM,你部署的代码或者环境都没了.现在 ...

  6. git 代码托管使用方法

    Git代码托管 1 准备材料 在coding,github这些代码托管网站上申请一个账户. Linux平台什么需要一个git,如ubuntu 需要 $ sudo apt-get install git ...

  7. WPF Datagrid对鼠标单击进行响应,借助EventSetter

    在做的一个c#的项目中发现Datagrid没办法直接对鼠标单击进行响应, 调用MouseDown事件也需要点击某一行第二次才能响应. 所以借助EventSetter来简单的实现了一个. 界面部分的代码 ...

  8. python——int()函数

    1. 使用 int() 将小数转换为整数,结果是向上取整还是向下取整呢? 小数取整会采用比较暴力的截断方式,即向下取整.(注:5.5向上取整为6,向下取整为5) 2. 我们人类思维是习惯于“四舍五入” ...

  9. [BZOJ2527] [Poi2011]Meteors(整体二分)

    对于单个国家,可以对答案进行二分,每次找出此时的陨石数量,如果大于需要的那么答案就在[l,mid],否则就在[mid+1,r]里面 而对于很多国家,也可以进行二分,solve(l,r,L,R)表示询问 ...

  10. (A)eclipse搭建springboot项目入门

    网上许多资料都是用idea的,但是我个人用eclipse习惯了,所以就在eclipse里面自己尝试着写了一个hello. 然而项目建好后却迟迟不能访问!!!网上搜了许多资料都不靠谱! 虽然最后能看到h ...