在Linux系統下使用SSH實現端口映射的方法?
從技術角度來分析,幾個要求:
1、從安全方面看,sftp會更安全一點
2、線上服務器提供在線服務,對用戶需要控制,只能讓用戶在自己的home目錄下活動
3、用戶只能使用sftp,不能SSH到機器進行操作
提供sftp服務,可以用系統自帶的internal-sftp,也可以使用vsftpd,這里需求不多,直接選用internal-sftp。
限制用戶只能在自己的home目錄下活動,這里需要使用到chroot,openssh4.8p1以后都支持chroot,我現在用的是centos6.3,自帶的openssh已經是5.3p1,足夠了。
可以輸入:
#ssh-v
來查看openssh的版本,如果低于4.8p1,需要自行升級安裝,不在這里具體介紹了。
假設,有一個名為sftp的組,這個組中的用戶只能使用sftp,不能使用ssh,且sftp登錄后只能在自己的home目錄下活動
1、創(chuàng)建sftp組
#groupaddsftp
2、創(chuàng)建一個sftp用戶,名為mysftp
#useradd-gsftp-s/bin/falsemysftp
#passwdmysftp
3、sftp組的用戶的home目錄統一指定到/data/sftp下,按用戶名區(qū)分,這里先新建一個mysftp目錄,然后指定mysftp的home為/data/sftp/mysftp
#mkdir-p/data/sftp/mysftp
#usermod-d/data/sftp/mysftpmysftp
4、配置sshd_config
編輯/etc/ssh/sshd_config
#vim+132/etc/ssh/sshd_config
找到如下這行,并注釋掉
subsystemsftp/usr/libexec/openssh/sftp-server
添加如下幾行
subsystemsftpinternal-sftp
matchgroupsftp
chrootdirectory/data/sftp/%u
forcecommandinternal-sftp
allowtcpforwardingno
x11forwardingno
解釋一下添加的幾行的意思
subsystemsftpinternal-sftp
這行指定使用sftp服務使用系統自帶的internal-sftp
matchgroupsftp
這行用來匹配sftp組的用戶,如果要匹配多個組,多個組之間用逗號分割
當然,也可以匹配用戶
matchusermysftp
這樣就可以匹配用戶了,多個用戶名之間也是用逗號分割,但我們這里按組匹配更靈活和方便
chrootdirectory/data/sftp/%u
用chroot將用戶的根目錄指定到/data/sftp/%u,%u代表用戶名,這樣用戶就只能在/data/sftp/%u下活動,chroot的含義,可以參考這里:http://www.ibm.com/developerworks/cn/linux/l-cn-chroot/
forcecommandinternal-sftp
指定sftp命令
allowtcpforwardingno
x11forwardingno
這兩行,如果不希望該用戶能使用端口轉發(fā)的話就加上,否則刪掉
5、設定chroot目錄權限
#chownroot:sftp/data/sftp/mysftp
#chmod755/data/sftp/mysftp
錯誤的目錄權限設定會導致在log中出現”fatal:badownershipormodesforchrootdirectoryxxxxxx”的內容
目錄的權限設定有兩個要點:
1、由chrootdirectory指定的目錄開始一直往上到系統根目錄為止的目錄擁有者都只能是root
2、由chrootdirectory指定的目錄開始一直往上到系統根目錄為止都不可以具有群組寫入權限
所以遵循以上兩個原則
1)我們將/data/sftp/mysftp的所有者設置為了root,所有組設置為sftp
2)我們將/data/sftp/mysftp的權限設置為755,所有者root有寫入權限,而所有組sftp無寫入權限
6、建立sftp用戶登入后可寫入的目錄
照上面設置后,在重啟sshd服務后,用戶mysftp已經可以登錄,但使用chroot指定根目錄后,根應該是無法寫入的,所以要新建一個目錄供mysftp上傳文件。這個目錄所有者為mysftp,所有組為sftp,所有者有寫入權限,而所有組無寫入權限
#mkdir/data/sftp/mysftp/upload
#chownmysftp:sftp/data/sftp/mysftp/upload
#chmod755/data/sftp/mysftp/upload
7、重啟sshd服務
#servicesshdrestart
到這里,mysftp已經可以通過sftp客戶端登錄并可以上傳文件到upload目錄。
如果還是不能在此目錄下上傳文件,提示沒有權限,檢查selinux是否關閉,可以使用如下指令關閉selinux
修改/etc/selinux/config文件中的selinux=""為disabled,然后重啟。或者
#setenforce0