如何在CentOS7上安装和配置scponly
介绍
scponly 是匿名 FTP 的安全替代方案。 它使管理员能够设置具有受限远程文件访问权限且无需访问交互式外壳的安全用户帐户。
为什么使用 scponly 而不是普通的 SSH? 使用 scponly,您可以让用户远程访问以下载和上传特定文件。 它们将没有交互式外壳,这意味着它们无法执行命令。 用户只能通过 scp
、sftp
或支持这些协议的客户端访问服务器。 从安全角度来看,这通过限制对服务器上交互式 shell 的不必要访问来降低您的攻击面。
先决条件
对于本教程,您将需要一个全新的 CentOS 6 或 7 Droplet。
本教程中的所有命令都应以非 root 用户身份运行。 如果该命令需要 root 访问权限,它将在前面加上 sudo
。 如果您还没有设置,请按照以下教程进行操作:CentOS 6 上的初始服务器设置或 CentOS 7 上的初始服务器设置。
第 1 步 — 安装软件包
scponly 在一些第三方存储库中可用,但是这些 scponly 构建已经过时,并且缺少我们将在从源代码构建 scponly 时添加的一些功能。
要从源代码构建 scponly,您需要安装以下 5 个软件包:
- wget(通过命令行下载文件)
- gcc(从源代码编译 scponly)
- man(阅读手册页)
- rsync(提供高级文件复制)
- openssh-client-tools(提供各种 ssh 工具)
我们将使用 yum 安装构建 scponly 所需的必备软件包。 在 yum 安装期间,我们将传递所需的软件包名称以及 -y
,它会自动对任何提示回答是。
使用 yum install
命令安装 wget
、gcc
、man
、rsync
和 openssh-clients
:
sudo yum install wget gcc man rsync openssh-clients -y
第 2 步 — 下载并提取 scponly
在本节中,我们将使用 wget
从 sourceforge 下载最新版本的 scponly,并使用 tar
提取文件。
在下载 scponly 之前,请切换到 /opt
目录。 该目录通常是为 可选 软件指定的。
cd /opt
截至本文为止,scponly 的最新快照是 2011.05.26。 您可以查看 Sourceforge 页面 以获得更高版本并相应地调整 wget
命令。
使用 wget
下载 scponly 源:
sudo wget http://sourceforge.net/projects/scponly/files/scponly-snapshots/scponly-20110526.tgz
提取 scponly 源代码:
sudo tar -zxvf scponly-20110526.tgz
第 3 步 — 构建和安装 scponly
在本节中,我们将使用 3 个主要命令来构建 scponly:configure
、make
和 make install
。 这些是从源代码下载和安装软件时最常用的 3 个命令。
切换到包含刚刚解压缩的 scponly 源代码的目录:
cd /opt/scponly-20110526
首先,运行 configure
命令来构建一个 makefile,其中包含在从源代码构建时要启用或禁用的所有功能:
sudo ./configure --enable-chrooted-binary --enable-winscp-compat --enable-rsync-compat --enable-scp-compat --with-sftp-server=/usr/libexec/openssh/sftp-server
使用了以下选项:
--enable-chrooted-binary:
安装 chroot 二进制文件scponlyc
--enable-winscp-compat:
启用与 Windows scp/sftp 客户端 WinSCP 的兼容性--enable-rsync-compat:
启用与 rsync 的兼容性,这是一个非常通用的文件复制实用程序--enable-scp-compat:
启用与 UNIX 样式 scp 命令的兼容性
接下来我们将使用 make
命令构建 scponly。 make
命令采用您使用 configure
命令传递的所有选项,并将其构建到将在操作系统上安装和运行的二进制文件中。
sudo make
接下来我们将使用 make install
安装二进制文件:
sudo make install
最后将 scponly shell 添加到 /etc/shells
文件中:
sudo /bin/su -c "echo "/usr/local/bin/scponly" >> /etc/shells"
/etc/shells
文件告诉操作系统哪些 shell 可供用户使用。 所以我们告诉操作系统我们向系统添加了一个名为 scponly
的新 shell,并且二进制文件位于 /usr/local/bin/scponly
。
第 4 步 — 创建 scponly 组
现在我们将创建一个名为 scponly 的组,以便我们可以轻松地管理所有将使用 scponly 访问服务器的用户。
sudo groupadd scponly
第 5 步 — 创建上传目录并设置适当的权限
在本节中,我们将为 scponly 组创建一个集中的上传目录。 这使您可以控制可以将数据上传到服务器的位置和数量。
创建一个名为 /pub/upload
的目录,这将是一个专门用于上传的目录:
sudo mkdir -p /pub/upload
将 /pub/upload
目录的组所有权更改为 scponly
:
sudo chown root:scponly /pub/upload
下一步是设置 /pub/upload
目录的权限。 通过将此目录的权限设置为 770,我们仅授予 root 用户和 scponly 组的成员访问权限。
将 /pub/upload
目录的权限更改为所有者和组的读取、写入和执行权限,并删除其他人的所有权限:
sudo chmod 770 /pub/upload
第 6 步 — 使用 scponly Shell 创建用户帐户
现在我们将设置一个测试用户帐户来验证我们的 scponly 配置。
创建一个名为 testuser1 的用户,并将 scponly 指定为备用组,并将 /usr/local/bin/scponly
指定为 shell:
sudo useradd -m -d /home/testuser1 -s "/usr/local/bin/scponly" -c "testuser1" -G scponly testuser1
注意: 接下来是很重要的一步。 用户的主目录不应该是可写的,因为他们可以修改某些 SSH 参数并可能破坏 scponly shell。
将 testuser1 主目录的权限更改为仅为所有者读取和执行:
sudo chmod 500 /home/testuser1
最后,为 testuser1 用户设置密码:
sudo passwd testuser1
第 7 步 — 验证用户无权访问交互式 Shell
现在我们将测试 scponly shell 访问并验证它是否按预期工作。
让我们验证 testuser1 帐户是否无权访问终端。
尝试以 testuser1 身份登录服务器:
su - testuser1
由于您无法访问交互式 shell,您的终端将挂起。 按 CTRL+C
退出 scponly shell。
您还可以从本地计算机测试访问:
ssh testuser1@your_server_ip
同样,您的终端将挂起,因为不允许 testuser1 访问 shell。 按 CTRL+C
退出 scponly shell。
第 8 步 — 测试用户下载文件的能力
在本节中,我们将通过 sftp
从您的本地计算机连接到您的 DigitalOcean Droplet,以验证 testuser1
帐户是否可以下载文件。
首先使用 fallocate
创建一个 100 兆字节的文件:
sudo fallocate -l 100m /home/testuser1/testfile.img
将 testfile.img
文件的所有权更改为 testuser1:
sudo chown testuser1:testuser1 /home/testuser1/testfile.img
在本地系统上将目录更改为 /tmp
:
cd /tmp
接下来 sftp
到您的 DigitalOcean 服务器:
sftp testuser1@your_server_ip
输入密码时,系统可能会提示您保存 ssh 密钥。
一旦在 sftp>
提示符下登录问题 ls -l
:
ls -l
使用 get
命令下载文件:
get testfile.img
文件下载完成后,键入 quit
退出:
quit
返回本地计算机,验证文件是否已成功下载:
ls -l testfile.img
第 9 步 — 测试用户上传文件的能力
在本节中,我们将测试 testuser1
帐户使用 sftp
将文件上传到服务器的能力。
注意: 在本节中,我们将限制对 /pub/upload
目录的访问。 这不是必需的,但出于多种原因,例如管理配额或磁盘使用以及轻松监控中心位置的所有上传,这是一项额外的安全优势。
在您的本地系统上,使用 fallocate
创建一个名为 uploadfile.img
的 100 MB 文件:
fallocate -l 100m /home/testuser1/uploadfile.img
从您的本地系统连接到您的 DigitalOcean Droplet。
sftp testuser1@your_server_ip
接下来从sftp
提示上传uploadfile.img
到/pub/upload
:
put uploadfile.img /pub/upload/
通过在 sftp
提示符下发出以下命令来验证文件是否已成功上传:
ls -ltr /pub/upload
结果应类似于:
-rw-r--r-- 1 testuser1 testuser1 104857600 Jun 5 07:46 uploadfile.img
最后在 sftp
提示符下输入 quit
:
quit
结论
scponly 应该在每个管理员的工具箱中。 它可以用作匿名 FTP 的安全替代方案,或者作为一种让经过身份验证的用户能够在没有交互式 shell 的情况下下载和上传文件的方式。 scponly 的日志记录发生在标准 ssh 日志文件 /var/log/secure
中。 一如既往地阅读手册页并保持系统更新。
有关 scponly 的更多信息,请转到 scponly GitHub 页面。