sftp配置多用戶權限&& 密鑰登陸

工做須要,用戶上傳文件到目錄下,用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
相關文章
相關標籤/搜索