使用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
使用rssh创建一个安全的文件服务器的更多相关文章
- 使用socket编程实现一个简单的文件服务器
使用socket编程实现一个简单的文件服务器.客户端程序实现put功能(将一个文件从本地传到文件服务器)和get功能(从文件服务器取一远程文件存为本地文件).客户端和文件服务器不在同一台机器上. pu ...
- 「两」创建一个带 ssh 镜座服务(修订版)--采用 Dockerfile 创
创建目录 首先,创建一个叫做 sshd_ubuntu 的目录,用于存放我们的 Dockerfile .脚本文件.以及其它文件. $ mkdir sshd_ubuntu $ ls sshd_ubuntu ...
- 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用
由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...
- 用html5的canvas和JavaScript创建一个绘图程序
本文将引导你使用canvas和JavaScript创建一个简单的绘图程序. 创建canvas元素 首先准备容器Canvas元素,接下来所有的事情都会在JavaScript里面. <canvas ...
- 搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 (1)
搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 原文地址(英文):http://www.networkcomms.net/creating ...
- ASP.NET Core管道深度剖析(2):创建一个“迷你版”的管道来模拟真实管道请求处理流程
从<ASP.NET Core管道深度剖析(1):采用管道处理HTTP请求>我们知道ASP.NET Core请求处理管道由一个服务器和一组有序的中间件组成,所以从总体设计来讲是非常简单的,但 ...
- 5分钟创建一个SpringBoot + Themeleaf的HelloWord应用
第一步:用IDE创建一个普通maven工程,我用的eclipse. 第二步:修改pom.xml,加入支持SpringBoot和Themeleaf的依赖,文件内容如下: <?xml version ...
- 如何创建一个简单的Visual Studio Code扩展
注:本文提到的代码示例下载地址>How to create a simple extension for VS Code VS Code 是微软推出的一款轻量级的代码编辑器,免费,开源,支持多种 ...
- 如何用Unity创建一个的简单的HoloLens 3D程序
注:本文提到的代码示例下载地址>How to create a Hello World 3D holographic app with Unity 之前我们有讲过一次如何在HoloLens中创建 ...
随机推荐
- kubernetes基础架构及原理
kubernetes简称“k8s” 其中“8”代表的是“k”和“s”中间的8个字母. k8s是Google公司开发的Borg项目中独立出来的容器编排工具,然后将其捐献给CNCF这个组织,然后发扬光大. ...
- Rsync备份服务部署
1 Rsync服务器架构规划 在搭建服务之前需要做以下规划设计,其中包括:主机规划表.主机IP地址规划表.主机架构图.主机hosts解析以及linux主机基础优化等 1.1 主机规划表 服务器说明 数 ...
- 天气预报api-汇总
和风天气 https://www.heweather.com/
- 4W条人才表循环处理业务sql优化过程
场景: 使用windows服务定时更新合同数据:执行存储过程(pas_RefreshContractStatus),但存储过程里面有一个需要更新4W条人才表循环处理业务 问题: 循环更新4W条人才表状 ...
- PHP 输出控制
一.前言 说到PHP输出控制, 在很多框架里面,比如说TP,Yii和Laraval的模版引擎里面都有输出控制函数的阴影,输出控制也叫输出缓冲,说到它的作用有以下几点. 二.内容 1. 输出模版 $va ...
- 时间轮算法的定时器(Delphi)
源码下载 http://files.cnblogs.com/lwm8246/uTimeWheel.rar D7,XE2 编译测试OK //时间轮算法的定时器 //-- : QQ unit uTimeW ...
- 笔记-git-基础使用
笔记-git-基础使用 1. git相关概念 工作区(Working Directory): 就是在电脑里能看到的目录,init后的当前目录就是一个工作区: 版本库(Repository): ...
- TouTiao开源项目 分析笔记3
1.搭建NewsTabLayout片段 1.1.加载布局 @Nullable @Override public View onCreateView(LayoutInflater inflater, @ ...
- Diycode开源项目 如何解决InputMethodManager造成的内存泄漏问题
1.内存泄漏的状况及原因 1.1.利用LeakCanary查看内存泄漏的状况 1.2.内存泄漏怎么产生的呢? InputMethodManager.mServicedView持有一个最后聚焦View的 ...
- SpringMVC---web.xml配置详解
web.xml中需要配置的内容 1.配置监听器<listener> 它有两个监听器: 1). <!--配置文件加载监听器--> <listener> <lis ...