SFTP専用ユーザを作成するときにちょいちょいやり方忘れるので、自分用にまとめ。
やりたいこと
- sftp接続用にパスなしの公開鍵を作成する
- sftpコマンドでしか接続できない(sshできない)ユーザを作成する
- sftp接続時に接続先の階層が見えないようにする(ルートディレクトリを
/
にする)
接続元のIPアドレス制限をしたかったら、EC2のセキュリティグループへ接続元IPアドレスの設定を追加しておく。
接続ユーザの作成
ユーザのホームディレクトリをSFTP専用にするので、接続用ユーザを新規に作成する。
$ sudo su
$ useradd [username]
$ passwd [username]
認証鍵の作成
鍵なしの認証鍵を作成する。
※鍵なしなのはコマンドで色々処理させたい(パスワード入力の応答処理をさせたくない)から。
$ sudo su [username]
$ cd /home/[user_dir]
$ mkdir .ssh
$ cd .ssh
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/[user dir]/.ssh/id_rsa): *未入力(必要に応じてキー名を入力)
Enter passphrase (empty for no passphrase): *未入力
Enter same passphrase again: *未入力
Your identification has been saved in /home/[user dir]/.ssh/id_rsa.
Your public key has been saved in /home/[user dir]/.ssh/id_rsa.pub.
認証鍵が作成できたら、公開鍵をauthorized_keysに転記してパーミッションを変更する。
$ cp /home/[user_dir]/.ssh/id_rsa.pub /home/[user dir]/.ssh/authorized_keys
$ chmod 600 /home/[user_dir]/.ssh/authorized_keys
$ chmod 700 /home/[user_dir]/.ssh/
sftpコマンドでのみ接続を許可させる
authorized_keysの先頭に下記の記載を追加。
command="internal-sftp"
接続ディレクトリを制限する
SFTP接続時にいろいろ移動されたりしたくないので、接続できるディレクトリを制限する。
ChrootDirectoryは後で作成するSFTP接続用のディレクトリを設定する。
# 以下の行のコメントアウトを解除
Subsystem sftp /usr/libexec/openssh/sftp-server
# 以下を追加
Match user [username]
ChrootDirectory /home/[user_dir]/sftp-root
ForceCommand internal-sftp
sshd_configの編集が終わったら、sshdを再読み込みする。
$ service sshd reload
Reloading sshd: [ OK ]
ディレクトリ権限の変更
ホームディレクトリの権限を変更する。
ここでうっかり対象のディレクトリを間違うと悲惨な目に遭ったりする(体験談)
$ sudo su
$ chown root: /home/[user_dir]
$ chmod 755 /home/[user_dir]
ホームディレクトリの権限設定が完了したら、SFTP接続時のルートディレクトリを作成する。
※ルートディレクトリの名前を変える場合にはsshd_configのChrootDirectoryも忘れず変更する。
$ mkdir /home/[user_dir]/sftp-root *sshd_configのChrootDirectoryで設定したディレクトリ
$ chown root: /home/[user_dir]/sftp-root
$ chmod 755 /home/[user_dir]/sftp-root
ルートディレクトリを作成したら、書き込み用のディレクトリをその下に作成する。
$ mkdir /home/[user_dir]/sftp-root/sftp
$ chown [username]: /home/[user_dir]/sftp-root/sftp
$ chmod 777 /home/[user_dir]/sftp-root/sftp
接続確認
最初に作成した秘密鍵(/home/[user_dir]/.ssh/id_rsa)を使用して、SFTP接続できるか確認する。
以下が満たされていればOK。
- 接続できること
- Remote working directoryが
/
になっていること - 接続したディレクトリの配下に
sftp
(書き込み用ディレクトリ)が存在すること - 書き込み用ディレクトリで
put
get
ができること
$ sftp -i [認証鍵] [username]@[server]
Connected to [server]
sftp> pwd
Remote working directory: /
sftp> ls -la
drwxr-xr-x 3 0 0 4096 Dec 1 00:00 .
drwxr-xr-x 3 0 0 4096 Dec 1 00:00 ..
drwxrwxrwx 2 510 510 4096 Dec 1 00:00 sftp
sftpコマンドでのみ接続を許可しているので、ssh接続は下記のように拒否される。
もし拒否されなかったらauthorized_keysにちゃんと追記しているか確認する。
$ ssh -i [認証鍵] [username]@[server]
Could not chdir to home directory /home/[user_dir]: No such file or directory
This service allows sftp connections only.
Connection to [server] closed.