物理隔离环境搭建存储服务器——第一篇:FTP服务、用户与权限
(注:如若记忆没有出现偏差,本文应是写于2015年,楼主习惯使用LaTeX写笔记,后发现markdown不错,于是稍有修改后发布与此。)
(下文中的所有命令需要以root权限执行)
前言
目前个人常用的单块硬盘的存储量一般是4T左右,随着工作数据量的不断增加以及安全备份的需要,个人单机的容量往往不够用,因此使用大容量存储器成为了必然选择。大容量存储器既能满足团队的数据存储的需求,也有利于团队成员之间共享数据。目前服务器使用的单块硬盘容量可以达到8T左右(注:2017年已有单块10T的硬盘上市)。
这里假定团队除BOSS以外,还有包含以下成员:
表1:成员信息表
成员 | 主目录名称 | 次要组名 | 共享目录名称 | 备注 |
---|---|---|---|---|
BOSS | Boss | BeyondGroup | TeamShare | BOSS账户对所有成员的主目录拥有读取权限 |
忆霜晨 | YiSC | BeyondGroup | TeamShare | 兼职管理员,但并非root账户 |
Jack | Jack | BeyondGroup | TeamShare | |
Peter | Peter | BeyondGroup | TeamShare | |
美美 | MeiMei | BeyondGroup | TeamShare | |
雷雷 | LeiLei | BeyondGroup | TeamShare |
存储器的操作系统采用的是Linux(考虑到便利性,以及并不需要在存储器使用Windows的应用),在Linux的各种发行版中,以CentOS、Debian、Ubuntu等最具代表性,三个Linux发行版各有千秋,考虑到systemd等的应用趋势和软件库的更新速度,这里采用的是Debian 8作为存储器的操作系统。
一、搭建本地镜像
在物理隔离环境中,为了使用方便,可以搭建离线的本地镜像作为软件源。在Debian的发行版中,一般包含有三个iso镜像文件,这三个镜像文件可以挂载安装一些常用的Linux软件,但是毕竟包含不全。所以,将软件源从网上的镜像站点同步下来是一种更好的办法。
1.1 查看镜像源的使用帮助
在国内各个镜像站点中,163源下载速度不错,对于Debian 8.x版本来说,163源使用帮助如下(对应文件: /etc/apt/sources.list):
deb http://mirrors.163.com/debian/ jessie main non-free contrib
deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib
deb http://mirrors.163.com/debian/ jessie-backports main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie-updates main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie-backports main non-free contrib
#debian 的安全更新
deb http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib
deb-src http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib
- 第一个字段:包类型,deb是二进制包,deb-src表示源码包。
- 第二个字段:镜像站点的网址。
- 第三个字段:版本对应的仓库。
- jessie:表示Debian 8.x的主仓库;
- jessie-updates:表示非安全更新仓库;
- jessie-backports:表示后备仓库,Debian stable 发布后,其所有软件版本号便已被冻结,所有软件只修 bug,不增加任何特性。但有人可能需要新特性,甚至某些较新的软件原来根本就没有。该仓库正因此而设,但欠官方维护。
- 其余字段:
- main:本身是自由软件,且所有依赖的包也都是自由软件。
- non-free:本身并非自由软件,无论依赖如何。
- contrib:本身是自由软件,但依赖不纯,即依赖中至少有一例 contrib 或 non-free 者。
1.2 下载源
下载镜像源使用的是apt-mirror工具,在连接网络的Linux系统中安装此工具后(例如在Ubuntu安装sudo apt-get install apt-mirror
),配置下载镜像源的网址。apt-mirror工具的配置文件是/etc/apt/mirror.list,将前面163源的使用帮助给出的地址添加到该配置文件中:
# 下载到哪个目录下
set base_path /media/sf_share/Debian8.x_amd64_mirror
set mirror_path $base_path/mirror
set skel_path $base_path/skel
set var_path $base_path/var
set cleanscript $var_path/clean.sh
set defaultarch <running host architecture>
# set postmirror_script $var_path/postmirror.sh
# set run_postmirror 0
# 下载使用的线程数
set nthreads 20
set _tilde 0
#镜像的网址
deb-amd64 http://mirrors.163.com/debian/ jessie main non-free contrib
deb-amd64 http://mirrors.163.com/debian/ jessie-updates main non-free contrib
deb-amd64 http://mirrors.163.com/debian/ jessie-backports main non-free contrib
deb-amd64 http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib
#clean http://ftp.cn.debian.org/debian
之后运行apt-mirror
命令即可。对Debian 8.x amd64来说,大概有70G左右的内容,可用tar工具将其打包以便拷贝。
1.3 配置源
镜像源下载好之后,修改/etc/apt/sources.list文件的配置内容,将使用的源改为本地下载好的镜像,然后执行命令:apt-get update
即可。
#这里的/xxx/表示镜像源在本地存放的路径。
deb file:/xxx/Debian8.x_amd64_mirror/mirror/mirrors.163.com/debian/ \
jessie main contrib non-free
deb file:/xxx/Debian8.x_amd64_mirror/mirror/mirrors.163.com/debian/ \
jessie-updates main non-free contrib
deb file:/xxx/Debian8.x_amd64_mirror/mirror/mirrors.163.com/debian/ \
jessie-backports main non-free contrib
deb file:/xxx/Debian8.x_amd64_mirror/mirror/mirrors.163.com/debian-security/ \
jessie/updates main non-free contrib
注意:使用本地源执行apt-get update
时,如出现“Release file expired”错误,执行如下命令进行更新操作:apt-get -o Acquire::Check-Valid-Until=false update
。或者在/etc/apt/apt.conf.d/建立文件例如取名:10no--check-valid-until,然后写入内容:
Acquire::Check-Valid-Until "0";
二、FTP服务设置
在对比了几种FTP之后,这里选择使用PureFTP工具来创建FTP服务器。
2.1 安装配置
在 Debian 中, PureFTP 通过/etc/pure-ftpd/conf/目录中的配置文件来确定启动参数。也可以通过查询启动参数的意义,直接采用命令启动,不过最好还是配置这些文件,通过 PureFTP 的内置转换工具,自动将配置文件转换为启动参数。(PureFTP会将参数转换为启动命令,通过systemctl status pure-ftpd
可以查看PureFTP的详细启动命令,即可了解其默认设置。)
参数的意义参见官方手册,这里通过脚本来完成配置。需要注意的是,和官方的配置方式不同,在Debian中,PureFTP的每一个参数都对应一个以该参数命名的文件。
Tips:官方手册中除了包含编译、使用等内容以外,还有一个常见问题列表,这个列表非常值得参考,例如如何设置给用户设置共享文件夹等。
文件: ftpSet.sh
#!/bin/bash
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
echo -e "\n 安装 pureFTP"
apt-get install pure-ftpd pure-ftpd-common -y
# 配置 pureFTP
echo -e "\n 配置 pureFTP"
confDir=/etc/pure-ftpd/conf
# 默认已禁止匿名登录
# 限制用户在自己的主目录里
echo "yes" > $confDir/ChrootEveryone
# 使用系统认证用户
echo "yes" > $confDir/UnixAuthentication
# 禁止以.开头文件的读写
echo "yes" > $confDir/ProhibitDotFilesWrite
echo "yes" > $confDir/ProhibitDotFilesRead
echo "yes" > $confDir/DontResolve
# 最大连接数
echo "5" > $confDir/MaxClientsPerIP
# 最大空闲时长
echo "20" > $confDir/MaxIdleTime
# 最大磁盘使用率
echo "98" > $confDir/MaxDiskUsage
# 创建文件的默认权限设置
echo "117 117" > $confDir/Umask
echo -e "\n 重启 pure-ftpd 服务"
systemctl restart pure-ftpd
2.2 设置共享目录
在 chroot 开启的时候如何给 FTP 用户设置共享目录呢?这个问题官方的常见问题手册给出了回答。 PureFTP 源码编译时,可以选择虚拟 chroot 选项,这种情形下,可以通过创建软链接: ln -s
来实现共享 (注意使用绝对路径)。但是, Debian 官方仓库中并未开启虚拟 chroot 选项。另一种更好的方法是,将共享目录挂载到用户目录下,命令为: mount - -bind
。可写到/etc/fstab 文件中,实现开机挂载。在下一部分会继续介绍。
2.3 虚拟用户
PureFTP 的用户不一定非得是 Linux 用户,可以通过设定一个专门的 FTP Linux 账户,然后所有虚拟用户通过该专门的 Linux 账户访问 FTP,具体命令参见官方手册。
增加虚拟、修改虚拟账户的命令是: pure-pw,其后跟的命令和 Linux 账户配置是一样的。存储虚拟账户的文件格式为:
<account>:<password>:<uid>:<gid>:<gecos>:<home>:...
该文件包含了用户使用 FTP 的宽带等设置,其中, account、 password、 uid、 gid、 home 为非空字段。密码的加密方式和系统账户是一样的, home 字段若以“/./”结尾则表示 chroot。添加虚拟用户后, Pure-FTP 的命令可将该文件转化为二进制的 PureDB,该文件是二进制文件,经过了排序处理,在有大量虚拟用户的情况下,可以加快处理速度。也可以使用内置命令直接复制系统账户。
Tips:须查看 Pure-FTP 的配置文件,确认配置文件中默认设置的认证文件位置。例如,在Debian 7.x 中,须做一下如下操作:
cd /etc/pure-ftpd/auth
,然后ln -s ../conf/PureDB
,否则虚拟账户会无法进行认证,可以查看 log 确认问题所在。
三、创建账户并配置权限
3.1 账户设置
创建账号用到的命令及其主要参数意义如下:
useradd [参数选项] 用户账户名 *
参数 |
---|
-u:指定UID |
-g:初始用户组 |
-G:次要用户组 |
-m:创建主文件夹 |
-d:指定主文件夹的绝对路径 |
-s:指定shell |
根据前文中的表1,这里创建用户的命令为:
useradd -G BeyondGroup -m -s /bin/bash -d 主文件夹路径 用户名
创建账户之后,为账户设置密码并修改主文件夹的权限:
echo 用户名:密码 | chpasswd
chmod 750 主文件夹路径
在Debian 8中,使用上述命令创建账户时,账户的初始用户组与账户名字相同,例如:
useradd -G BeyondGroup -m -s /bin/bash -d /home/YiSC YiSC
/home/YiSC目录的所有者为YiSC,所属组也为YiSC。为了使BOSS账户可以查看组员的组目录,这里需要用到ACL(Access Control List),即访问控制列表。命令为:
setfacl -m u:BOSS:rx /home/YiSC
3.2 共享目录夹设置
3.2.1 共享目录权限
首先创建共享目录:
mkdir /home/TeamShare
为了能够使所有成员可以访问该目录,设置该目录的所属组为BeyondGroup,所有成员都包含在该组之中,因而可以访问该目录:
chown root:BeyondGroup /home/TeamShare
事情到这里并没有结束,假定用户YiSC在/home/TeamShare目录下,创建了hello.c文件,想共享给团队所有成员,那么会有什么问题呢?
Tips: 因为用户YiSC所属的默认组为YiSC,因此,hello.c文件的所属组为YiSC,而一般情况下,账户创建文件的others权限为0,所以团队其他成员无法查看该文件。(注:这里需要了解一点umask值的知识,输入命令
umask -S
即可查看该值,例如可以设置该值为0007,第四位为7,表示others权限在默认值基础上减掉7,也就是说创建的文件权限为770,others权限为0。)
那么如何解决这个问题呢?答案就是Set GID。Set GID即设置文件的特殊权限,数字为2,表现为 s 这个标志在文件用户组的 x 权限上。 可针对目录设置,对目录设置时:
- 用户在此目录下的有效用户组将会变成该目录的用户组;
- 在此目录下,用户创建的文件用户组与该目录用户组相同。
为共享目录设置特殊权限:
chmod 2770 /home/TeamShare
此时,用户YiSC在/home/TeamShare目录下创建了hello.c文件,hello.c文件的所属组和/home/TeamShare目录的所属组相同,都为BeyondGroup,因此团队所有成员都可以访问该文件了。
3.2.2 挂载目录
前面FTP部分提到了共享目录,由于FTP服务将用户限制在自己的主目录里,为了在FTP中访问共享目录,可以将共享目录挂载到用户的主目录下,并设置开机自动挂载。
# 在用户组目录创建一个目录用于挂载共享目录并设置权限
mkdir /home/YiSC/TeamShare
chown YiSC:YiSC /home/YiSC/TeamShare
# 开机挂载
echo "/home/TeamShare /home/YiSC/TeamShare none defaults,bind 0 0" \
>> /etc/fstab
四、配置用户环境
4.1 配置Vim
Vim常用的几款插件有:NERD-Tree、taglist、ctrlp等,在用户主目录创建.vim目录并下载的插件包解压到该目录,Vim的配置文件位于用户主目录的.vimrc文件。为用户简单配置Vim如下:
"文件: Vim.dat
"显示行号
set number
"显示光标当前位置
set ruler
"总是显示状态栏
set laststatus=2
" 高亮显示当前行/列
"set cursorline
"set cursorcolumn
"高亮显示搜索结果
set hlsearch
"查找前预览
set incsearch
"搜索时大小写不敏感
set ignorecase
"关闭兼容模式
set nocompatible
"禁止光标闪烁,gVim有效
"set gcr=a:block-blinkon0
"缩进方式
set tabstop=4
set softtabstop=4
set shiftwidth=4
"基于缩进或语法进行代码折叠
"set foldmethod=indent
set foldmethod=syntax
"启动 vim 时关闭折叠代码
set nofoldenable
"配色方案
colorscheme koehler
" 开启文件类型侦测
filetype on
" 根据侦测到的不同类型加载对应的插件
filetype plugin on
"语法高亮
if &t_Co > 2 || has("gui_running")
syntax on
set hlsearch
endif
"插件设置
map <F4> :NERDTreeToggle<CR>
map <F2> :TlistToggle<CR>
let Tlist_Use_Right_Window=1
nmap <C-H> <C-W>h " control+h进入左边的窗口
nmap <C-J> <C-W>j " control+j进入下边的窗口
nmap <C-K> <C-W>k " control+k进入上边的窗口
nmap <C-L> <C-W>l " control+l进入右边的窗口
"对齐插件设置,不是特别灵敏
let mapleader=";"
nmap <Leader>t& :Tab /&<CR>
vmap <Leader>t& :Tab /&<CR>
nmap <Leader>t= :Tab /=<CR>
vmap <Leader>t= :Tab /=<CR>
nmap <Leader>t" :Tab /"<CR>
vmap <Leader>t" :Tab /"<CR>
nmap <Leader>t: :Tab /:<CR>
vmap <Leader>t: :Tab /:<CR>
nmap <Leader>t:: :Tab /:\zs<CR>
vmap <Leader>t:: :Tab /:\zs<CR>
nmap <Leader>t, :Tab /,<CR>
vmap <Leader>t, :Tab /,<CR>
nmap <Leader>t,, :Tab /,\zs<CR>
vmap <Leader>t,, :Tab /,\zs<CR>
nmap <Leader>t<Bar> :Tab /<Bar><CR>
vmap <Leader>t<Bar> :Tab /<Bar><CR>
4.2 配置bash环境
bash的配置文件(注:给用户的配置文件)位于用户主目录的.bashrc文件,添加以下内容对bash进行简单的配置:
umask 0007
export LS_OPTIONS='--color=auto'
eval "`dircolors`"
alias ls='ls $LS_OPTIONS'
alias ll='ls $LS_OPTIONS -l'
alias l='ls $LS_OPTIONS -lA'
export GIT_EDITOR=vim
五、总结
通过脚本,可以将这些工作轻松处理。
5.1 安装必要的软件
文件: installPackages.sh
#!/bin/bash
echo -e "\nYiYi's 脚本: 安装 编译环境、 Git、 Vim、 ctags、 sudo 等软件包\n"
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
apt-get install build-essential vim -y
apt-get install ctags -y
apt-get install git git-gui -y
apt-get install sudo -y
5.2 配置root的工作环境
文件:setRootEnv.sh
#!/bin/bash
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
echo -e "\nYiYi's 脚本: 设置 root 的用户环境\n"
homeDir=/root
chmod 750 $homeDir
# 创建 vim 配置文件目录
if [ ! -d "/root/.vim" ]
then
mkdir $homeDir/.vim
fi
echo -e "YiYi's 脚本: 复制 Vim 插件\n"
cp -av VimPlugin/* $homeDir/.vim/
# Vim.dat的内容见前文。
cp -v Vim.dat $homeDir/.vimrc
echo -e "\nYiYi's 脚本: 设置 .bashrc"
cat $homeDir/.bashrc | grep -q ".mybashset"
# 对bash环境进行简单设置,rootBash.dat内容见前文。
if [ $? -ne 0 ]
then
cp -v rootBash.dat $homeDir/.mybashset
/bin/bash ./backupFile.sh $homeDir/.bashrc
echo "source $homeDir/.mybashset" >> $homeDir/.bashrc
fi
echo -e "\nYiYi's 脚本: 设置ssh"
/bin/bash ./backupFile.sh /etc/ssh/sshd_config
echo "UseDNS no" >> /etc/ssh/sshd_config
systemctl restart ssh
这里的backupFile.sh是用来将系统原始文件备份的。
文件:backupFile.sh
#!/bin/bash
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
fileName=$1
cp -p $1{,.$(date +%F-%H-%M-%S).backup}
5.3 增加用户
文件:addUsers.sh
#!/bin/bash
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
# 增加用户组
teamName=BeyondGroup
groupadd $teamName
# 用户
accounts=$(cat accounts.dat)
# HOME目录
homeDir=/RAID5
# 创建共享目录
shareDir=$homeDir/TeamShare
mkdir $shareDir
chown root:$teamName $shareDir
chmod 2770 $shareDir
/bin/bash ./backupFile.sh /etc/fstab
for data in $accounts
do
userName=$(echo $data | cut -d ":" -f 1)
initPasswd=$(echo $data | cut -d ":" -f 2)
#创建用户
echo "Add User:" $userName
useradd -G $teamName -m -s /bin/bash -d /$homeDir/$userName $userName
echo $userName:$initPasswd | chpasswd
#修改主文件目录权限
if [ -d $homeDir/$userName ]
then
echo "Set HOMEDIR 750:" $homeDir/$userName
chmod 750 $homeDir/$userName
fi
/bin/bash ./setuserEnv.sh $userName
/bin/bash ./shareDir.sh $userName
done
mount -a
/bin/bash ./setACL.sh
echo -e "\nAll Done!"
accounts.dat是账户名和对应的初始密码。
文件:accounts.dat
BOSS:xxxxxxxxxxxxxxxxxxx
YiSC:xxxxxxxxxxxxxxxxxxx
Jack:xxxxxxxxxxxxxxxxxxx
Peter:xxxxxxxxxxxxxxxxxxx
MeiMei:xxxxxxxxxxxxxxxxxxx
LeiLei:xxxxxxxxxxxxxxxxxxx
setuserEnv.sh用于设置用户环境。
文件:setuserEnv.sh
#!/bin/bash
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
echo -e "\nYiYi's 脚本: 设置 $1 的用户环境\n"
userName=$1
homeDir=/RAID5/$userName
# 创建 Vim 插件目录
if [ ! -d "$homeDir/.vim" ]
then
mkdir $homeDir/.vim
fi
# 复制 Vim 插件
echo -e "YiYi's 脚本: 复制 Vim 插件\n"
cp -av VimPlugin/* $homeDir/.vim/
chown -R $userName:$userName $homeDir/.vim
# 复制 Vim 配置文件
cp -v Vim.dat $homeDir/.vimrc
chown $userName:$userName $homeDir/.vimrc
# 复制 bash 配置文件
echo -e "\nYiYi's 脚本: 设置 .bashrc"
/bin/bash ./backupFile.sh $homeDir/.bashrc
cp -v Bash.dat $homeDir/.mybashset
chown $userName:$userName $homeDir/.mybashset
cat $homeDir/.bashrc | grep -q ".mybashset"
if [ $? -ne 0 ]
then
echo "source $homeDir/.mybashset" >> $homeDir/.bashrc
fi
shareDir.sh用于设置共享目录。
文件:shareDir.sh
#!/bin/bash
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
echo -e "\nYiYi's 脚本: 设置 $1 的用户环境\n"
useName=$1
homeBase=/RAID5
homeDir=$homeBase/$useName
shareDir=$homeDir/TeamShare
# 创建共享目录
if [ ! -d "$shareDir" ]
then
mkdir $shareDir
chown $useName:$useName $shareDir
else
echo -e "\nYiYi's 脚本: $shareDir 目录已存在\n"
fi
# 开机挂载
echo "$homeBase/TeamShare $shareDir none defaults,bind 0 0" \
>> /etc/fstab
setACL.sh用于设置BOSS用户访问组员目录权限。
文件:setACL.sh
#!/bin/bash
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
# 用户
accounts=$(cat accounts.dat)
# HOME目录
homeDir=/RAID5
superUser=BOSS
for data in $accounts
do
userName=$(echo $data | cut -d ":" -f 1)
if [ $userName != $superUser ]
then
setfacl -m u:$superUser:rx $homeDir/$userName
fi
done
echo -e "\nYiYi's 脚本: ACL权限设置完毕\n"