SFTP サーバ
種類 内容 備考 OS CentOS 7.5 (1804) 本稿記述時の最新版 SSH サーバ OpenSSH_7.4p1
OpenSSL 1.0.2kCentOS 7.5 に付属の物 SSH サーバ IPアドレス 192.168.56.102 - SSH サーバ ポート番号 22 - SFTP ユーザ名 sftpuser sftp のみを許可するユーザ (ssh を許可しない) SFTP ユーザのパスワード (なし) 公開鍵ログインだけにするため、パスワードは設定しない SFTP グループ名 / ID 番号 sftponly / 2000 sftp のみを許可するグループ (ssh を許可しない) SFTP ユーザのホームディレクトリ /home/sftpuser/ .ssh/ ディレクトリを作成します SFTP ユーザの公開鍵格納ディレクトリ /home/sftpuser/.ssh/ パーミッションは 700 にします SFTP ユーザの公開鍵ファイル /home/sftpuser/.ssh/authorized_keys パーミッションは 600 にします Chroot 先ディレクトリ /var/www/ 今回は Chroot もします
SFTP クライアント
*1 UserName は、Windows のユーザ名を指します。
種類 内容 備考 Windows Windows10 (1803) 本稿記述時の最新版 ファイル転送アプリ WinSCP 5.13.4(ビルド 8172) 本稿記述時の最新版 秘密鍵・公開鍵を作成するフォルダ PC > ドキュメント > PubKeys 実フォルダは
C:\Users\UserName\Documents\PubKeys\*1秘密鍵のファイル名 sftpuser.ppk WinSCP のログイン時に使用する 秘密鍵のパスフレーズ (なし) 今回はパスフレーズを設定しません 公開鍵のファイル名 sftpuser.txt 接続先サーバの .ssh/authorized_keys に追記する(加工してから)
1-1. Chroot 先ディレクトリのパーミッションを確認する
$ ls -ld /var/www1-2. SSH サーバの設定に公開鍵の許可がされているか確認する
ユーザ、グループが root:root でパーミッションが 755 (Group と Other に Write の権限がない) なので OK
drwxr-xr-x. 8 root root 4096 3月 22 15:53 2017 /var/www
$ ssh -V1-3. ファイル転送専用ユーザ用の設定をする
$ su
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
# cat /etc/ssh/sshd_config | egrep '(PubkeyAuthentication|AuthorizedKeysFile)'
*2 PubkeyAuthentication は省略時に yes が設定されます。つまり意図的に no が指定されていなければ OK。
#PubkeyAuthentication yes 公開鍵のログインを受け付ける*2 AuthorizedKeysFile .ssh/authorized_keys 公開鍵を格納するファイル名*3
*3 各ユーザのホームディレクトリが省略されているので、今回は /home/sftpuser/.ssh/authorized_keys となります。
# vi /etc/ssh/sshd_config1-4. sshd を再起動する。(sshd_config を更新したので)
internal-sftp を登録する。(Chroot するので)
Subsystem sftp はひとつしか登録できないので、既存定義は無効にする。
# override default of no subsystems #Subsystem sftp /usr/libexec/openssh/sftp-serverSubsystem sftp internal-sftp
以下を追記する
*4大文字/小文字を区別します。Group は group の記述では不可。
Match Group sftponly ChrootDirectory /var/www/ ForceCommand internal-sftp PasswordAuthentication no
↑ ここではグループでの指定を行っています。グループとユーザの両方を設定する場合は、以下のように指定します。
*5 sftpuser2 については、今回取り扱いません。
Match Group sftponly User sftpuser,sftpuser2 ChrootDirectory /var/www/ ForceCommand internal-sftp PasswordAuthentication no
# sshd -t # 定義に誤りがないか、チェックする。
# systemctl restart sshd
2-1. グループを作成する
# groupadd -g 2000 sftponly2-2. ユーザを作成する (公開鍵ログインだけにするため、ログインパスワードは設定しない)
# useradd -g sftponly sftpuser
# usermod -s /sbin/nologin -p '*' sftpuser # 通常のログインは禁止。パスワードフィールドに「*」を設定する。(何も設定しないとロックされているとみなされる)
#passwd sftpuser# ← パスワードは設定しない
#usermod -d / sftpuser# ← ホームディレクトリを変更すると .ssh/authoroized_keys が使用不能になる
3-1. WinSCP をダウンロードする
通常は WinSCP の公式サイト からダウンロードしますが、今回は窓の杜の WinSCP の紹介ページからダウンロードします。3-2. WinSCP をインストールする
(Google で検索すると、公式サイトより窓の杜のほうが先に表示されるため)
3-2-1. ダウンロードしたインストーラをダブルクリックして起動する
3-2-2. ライセンスに同意して ボタンをクリックする
3-2-3. 標準的なインストール(T)(推奨) を選択して ボタンをクリックする
3-2-4. エクスプローラー(E) を選択して ボタンをクリックする
3-2-5. ボタンをクリックしてインストールを開始する
3-2-6. インストールが終了するまでプログレスバーが進む
3-2-7. インストールの終了。 ボタンをクリックしてインストーラを終了する
以下のチェックボックスを外しておく
・□ WinSCPを起動
・□ スタートページを開く
4-1. WinSCP を起動する
4-2. ログインウィンドウから「ツール(T)」-「PuTTYgen を実行(G)」を選択し、「PuTTY Key Generator」を開く
4-3. 「PuTTY Key Generator」ウィンドウで ボタンをクリックすると、ランダムキーの生成が開始されるので、
中段のフィールドでマウスを適当に動かす(プログレスバーがいっぱいになるまで)
⇒4-4. ランダムキーの生成により、秘密鍵・公開鍵が作成されるので、それぞれをファイルに保存する。
秘密鍵の保存時には Key passphrase (パスフレーズ: パスワードのこと) を指定することができる。4-5. 秘密鍵の保存
秘密鍵はコピーすると誰でも使えてしまうため、
Windows を共有アカウントで使用している場合は、必ずパスフレーズを設定すること。
ここでは「Key passphrase:」を未記入にしている (←非推奨) ので警告ウィンドウが表示される。
作成された秘密鍵・公開鍵を両方とも保存する。
(どちらが先でも構わないが、両方保存する)
秘密鍵の保存: ボタンをクリックする -> 4-5 へ 公開鍵の保存: ボタンをクリックする -> 4-6 へ
⇒ 警告ウィンドウ
上記 4-4 で ボタンをクリックするとファイル保存のウィンドウが表示されるので、4-6. 公開鍵の保存
フォルダとファイル名を指定し ボタンをクリックする。
保存フォルダ PC > ドキュメント > PubKeys 保存ファイル sftpuser.ppk
上記 4-4 で ボタンをクリックするとファイル保存のウィンドウが表示されるので、4-7. 鍵生成の終了
フォルダとファイル名を指定し ボタンをクリックする。
保存フォルダ PC > ドキュメント > PubKeys 保存ファイル sftpuser.txt
メニュー「File」-「Exit」を選択し、PuTTY Key Generator を閉じる
5-1. 公開鍵を加工する
上記 4-6 で作成した公開鍵を以下のように 1 行に加工する。5-2. 公開鍵を格納するディレクトリとファイル (空っぽでも良い) を作成する。
PuTTY Key Generator で作成した公開鍵 (sftpuser.txt)
↓
---- BEGIN SSH2 PUBLIC KEY ---- Comment: "rsa-key-20180911" AAAAB3NzaC1yc2EAAAABJQAAAQEAsGYL5EHQotwuCkZymBWT05FUE4XiEHFGLtiZ GV4bc6Ne++m1ib7AJrVNdfpSJqf4ZDroLMBitmy+iZCQQNXE1ynaxQqWn2ZAnqCt IrQVnBc0Pb2oYeTR6RuSAbBHDBhKc4R/l2KkZlAtbWcc/8lsEQu8IosjXKbR/JF2 TbPWuHWx9Vv1Owc5O/dizwPTp8sHp9LKpHKhcl7aSJ1XD0S9jav+5Dforjawa4D7 jvNij3rJ7hXzlcXtJFFhEFMs/tm0Olgx3KUEHW28FtL6uYrU9tIj211vPy1HymgK 456GH1g1fXAcHRvwHRrQEEKSIeP0CRGLByaeis2x20MLGCgHRQ== ---- END SSH2 PUBLIC KEY ----
サーバに登録するテキスト (1 行にして、行頭に 'ssh-rsa ' を挿入する)
*6ページの都合上、(~長いので省略~) と記述していますが、実際に省略してはいけません。
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAsGYL5EHQot(~長いので省略~)H1g1fXrQEEKSIeP0CRGLByaeis2x20MLGCgHRQ==
# mkdir /home/sftpuser/.ssh5-3. 上記 5-1 で加工した公開鍵を公開鍵ファイルに追記する。
# chmod 700 /home/sftpuser/.ssh
# chown sftpuser:sftponly /home/sftpuser/.ssh
# touch /home/sftpuser/.ssh/authorized_keys
# chmod 600 /home/sftpuser/.ssh/authorized_keys
# chown sftpuser:sftponly /home/sftpuser/.ssh/authorized_keys
# cat >> /home/sftpuser/.ssh/authorized_keys << EOF
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAsGYL5EHQot(~長いので省略~)H1g1fXrQEEKSIeP0CRGLByaeis2x20MLGCgHRQ==
EOF
6-1. WinSCP を起動する
6-2. ログインウィンドウの左ペインで「新しいサイト」を選択し、「セッション」と「認証」に以下を設定する
*7 UserName は、Windows のユーザ名を指します。
セッション 転送プロトコル(F) SFTP ホスト名(H) 192.168.56.102 ポート番号(R) 22 ユーザ名(U) sftpuser パスワード(P) (記入しない) 認証 秘密鍵(K) C:\Users\UserName\Documents\PubKeys\sftpuser.ppk*7
をクリックして「高度なサイトの設定」を表示する
↓
左ペインの「SSH」-「認証」を選択し、
右ペインの「秘密鍵」に sftpuser.ppk (上記 4-5 で作成したファイル)
を指定して ボタンをクリックする。
↓
「ログイン」ウィンドウに戻るので、セッション情報を記入し、 ボタンをクリックする。
↓
保存名の確認ウィンドウ
ボタンをクリックして保存する。
↓
ログイン情報の保存完了。
ボタンをクリックしてログインウィンドウを閉じる。
7-1. WinSCP を起動し、作成したログイン情報を使用してログインする。
上記 6 で作成したログイン情報が表示されているので、これを選択し、 ボタンをクリックする。7-3. ログイン成功
↓
初めてログインするサーバのホストの公開鍵は WinSCP に未登録のため、 ボタンをクリックして接続先サーバの公開鍵を取り込む。
一度取り込めば、次回からは警告が表示されない。
ただし、何らかの原因で接続先サーバの公開鍵が変更されると、同じような警告が表示される。
秘密鍵にパスフレーズを設定した場合
上記 4-4 で Key passphrase にパスフレーズを記入した場合は、このウィンドウが表示される。秘密鍵のパスフレーズを変更/削除する場合
設定したパスフレーズと同一の文字列を記入して ボタンをクリックする。
Key passphrase は秘密鍵にパスワードをかけるもので、付けたり外したりできる。
パスワードの付け外しは「PuTTY Key Generator」(上記 4-4) を表示して以下のようにする。
このとき公開鍵は変更されないので、改めてサーバに登録する必要はない。
1. 秘密鍵を読み込む ( ボタン)
2. パスワードを変更する (Key passphrase を変更 / 削除)
3. 秘密鍵を保存する ( ボタン)
例として作成しておいた /var/www/www.example.com/ (775) が、(Chroot しているため) /www.example.com/ として見えている。Chroot ディレクトリのパーミッションは 755 の必要があるため、管理者以外に書き込みを許可する場合は、この例のように書き込みを許可したサブディレクトリを使用する。