工做須要,用戶上傳文件到目錄下,用ftp不太安全,選擇sftp。讓用戶在本身的home目錄下活動,不能ssh到機器進行操做。
下面開始幹活。 查看ssh版本 ssh -V,個人系統是CentOS6.4 ssh版本是5.3(大於4.8)的沒有問題。
0, 建立用戶目錄root權限下建立用戶和屬組都是root
mkdir -p /opt/sftp/dir1/{upload,public}
1,建立 groupadd sftp
2. 建立 user -s /sbin/nologin -G sftp davis
user -s /sbin/nologin -G sftp davis1
3, 建立 davis 密碼
passwd davis or echo davis:123456|chpasswd
passwd davis1
4, 修改sshd_config文件
#Subsystem sftp /usr/libexec/openssh/sftp-server(註釋掉)
添加下面行
Subsystem sftp internal-sftp
Match Group sftp (Match User $username) shell
ChrootDirectory /opt/sftp/dir1 ($homedir)or %h
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
重啓sshd /etc/init.d/sshd restart
5, 給目錄附屬權限
chown davis:sftp /opt/sftp/dir1/upload
chown davis1:sftp /opt/sftp/dir1/public
chmod 700 /opt/sftp/dir1/upload
chmod 700 /opt/sftp/dir1/public
6, 將upload 給davis用戶
usermod -d /upload davis
usermod -d /public davis1
7, 測試 ssh davis@localhost 和 sftp davis@localhost or sftp -oPort=2000 davis@localhost(ssh端口更換爲2000)
sftp登錄davis賬號,對應的是/upload,而davis1 登錄後則對應的是/public
注意:
要實現Chroot功能,目錄權限的設置很是重要。不然沒法登陸,給出的錯誤提示讓人無從下手。
目錄權限設置
ChrootDirectory設置的目錄權限及其全部的上級文件夾權限,屬主和屬組必須是root;
ChrootDirectory設置的目錄權限及其全部的上級文件夾權限,只有屬主能擁有寫權限,也就是說權限最大設置只能是755
ChrootDirectory %h 若是選擇了這種模式,用戶的home目錄必須是root:root 權限,不然就會報錯。
記錄一下,以備之後使用,同時也提供給有須要的朋友。 安全
Sftp 密鑰登陸 bash
mkdir -p $homedir/.ssh ssh
chmod 700 $homedir/.ssh 測試
chmod 600 $homedir/.ssh/authorized_keys spa
chown -R $username.sftp $homedir/.ssh .net
把用戶生成的公鑰更名爲authorized_key便可 rest
寫了個腳本,內容以下 code
#!/bin/bash # #create sftp user # Author: davis.qi # Last Modified: 2013/11/14 by davis.qi userfile=/etc/passwd groupfile=/etc/group homedir=/opt/sftp loginshell=/sbin/nologin groupname=sftp username=$2 ssh_conf=/etc/ssh/sshd_config fftp="Subsystem sftp internal-sftp" gftp=`grep "internal-sftp" $ssh_conf` pa=123456 function add_sshconf() { if [ "w$gftp" == "w" ] then echo "no sftp-config." sed -i '/Subsystem/ s/^/#/' $ssh_conf cat >> $ssh_conf <<EOF Subsystem sftp internal-sftp #Match user $username Match group sftp ChrootDirectory %h X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp EOF else echo "you have add sftp-config ok" fi } function check_root() { if [ $EUID -ne 0 ]; then echo "This script must be run as root" exit 1 fi } function print_help(){ #Print help messages then exit echo "Usage: $0 {create|add_sshdir|delete} {username}" exit 1 } function check_usergroup(){ #cut -d : -f 1 $groupfile | grep -wq $groupname awk -F":" '{print $1}' $groupfile|grep -wq $groupname if [ $? -ne 0 ];then groupadd $groupname else echo " group $groupname is exist" fi } function check_homedir(){ #Create homedir if NOT exist if [ ! -d "$homedir" ];then mkdir -p $homedir fi } function check_username_exist(){ #Check if user already exist #cut -d : -f 1 $userfile | grep -wq $username awk -F":" '{print $1}' $userfile|grep -wq $username if [ $? -eq 0 ];then echo "User $username ALREADY exist." else useradd -d "$homedir/$username" -g $groupname -s $loginshell $username fi } function mk_passwd(){ echo "create $username passwd" echo $username:$pa|chpasswd } function mk_sshdir(){ # mkdir sshkey dir mkdir $homedir/$username/.ssh chmod 700 $homedir/$username/.ssh #chmod 600 $homedir/$username/.ssh/authorized_keys chown -R $username:$groupname $homedir/$username/.ssh } function mk_dir(){ # mkdir upload dir chmod 755 -R $homedir chown root.root $homedir/$username mkdir $homedir/$username/$upload && echo "create upload dir success." chown $username.$groupname $homedir/$username/$upload } if [ $# -lt 2 -o $# -gt 3 ];then print_help fi if [ "w$3" == "w" ] then upload=upload else upload=$3 fi case "$1" in 'create') check_root check_usergroup check_homedir add_sshconf && echo "add sshconfig on sshd_config ok" check_username_exist && echo "User $username was created." mk_dir && echo "$upload dir was created." mk_passwd && echo "username $username passwd $pa" mk_sshdir && echo "create .ssh dir ok" ;; 'delete') check_root userdel -rf $username && echo "User $username was deleted" rm -rf $homedir$username && [ ! -d $homedir$username ] && echo "User dir was deleted" ;; 'add_sshdir') mk_sshdir && echo "create .ssh dir ok" ;; *) print_help ;; esac