使用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. dts--tests(一)

    cmdline.py """ DPDK Test suite. Test cmdline. """ import utils from te ...

  2. pycharm中文乱码问题 总结

    前言: 这几天刚刚开始学习python,然后就安装了pycharm,但是那个中文乱码的问题真是让人心烦,在网上找了好久,都写得好乱,今天终于让我解决了,在这里总结一下经验,希望可以帮到你们 问题:如下 ...

  3. Makefile (3) 基本语法和使用

    make是用来管理一个工程项目的工具 . Makefile就是这个项目文件 . 1.Makefile 是由若干条规则组成的,每个规则的语法如下所示 : #规则 targets: prerequisit ...

  4. 可以字符串string转化成list,tuple,dict的eval()方法

    功能:将字符串str当成有效的表达式来求值并返回计算结果. 语法: eval(source[, globals[, locals]]) -> value 参数: source:一个Python表 ...

  5. PHP.15-mysqli

    从PHP5.0开始可以使用mysql(i), 是一个面向对象的技术(新加功能都会以对象形式添加) i:表示改进,1. 功能增加了, 2,效率大大增加(以后的PHP项目改成mysqli),3,更稳定 m ...

  6. Java语言基础---变量与数据类型

    变量的作用域 java用一对大括号“{}”作为语句块的范围,称为作用域.作用域中的变量不能重复定义:离开作用域,变量所分配的内存空间将被JVM所收回. 基本数据类型的包装类 java为基础数据类型提供 ...

  7. 虚拟机中如何挂载物理磁盘(VMware操作)

    测试的时候难免会遇到,从真是机器拷贝东西到虚拟机中,虽说安装了VMware tools(Vm→Install VMware tools...),就可以将文件直接拖到虚拟机里面去,但是这样拷贝总是需要花 ...

  8. erlang连接mysql [转]

    转自: http://blog.csdn.net/flyinmind/article/details/7740540 项目中用到erlang,同时也用到mysql.惯例,google. 但是,按照网上 ...

  9. sentry

    https://docs.sentry.io/quickstart/?platform=javascript

  10. winform小知识

    1.得到控制台或者winform程序在debug目录下生成的exe路径 建议使用:AppDomain.CurrentDomain.BaseDirectory或者Assembly.GetExecutin ...