WinSCP による公開鍵ログイン
〜 ssh コマンドを許可せず Linux サーバにファイルを転送 〜

2018-09-12 作成 福島
2021-08-01 更新 福島
TOP > tips > winscponly
[ TIPS | TOYS | OTAKU | LINK | MOVIE | CGI | AvTitle | ConfuTerm | HIST | AnSt | Asob | Shell ]

0. インストール要件
SFTP サーバ
種類内容備考
OSCentOS 7.5 (1804)本稿記述時の最新版
SSH サーバOpenSSH_7.4p1
OpenSSL 1.0.2k
CentOS 7.5 に付属の物
SSH サーバ IPアドレス192.168.56.102-
SSH サーバ ポート番号22-
SFTP ユーザ名sftpusersftp のみを許可するユーザ (ssh を許可しない)
SFTP ユーザのパスワード(なし)公開鍵ログインだけにするため、パスワードは設定しない
SFTP グループ名 / ID 番号sftponly / 2000sftp のみを許可するグループ (ssh を許可しない)
SFTP ユーザのホームディレクトリ/home/sftpuser/.ssh/ ディレクトリを作成します
SFTP ユーザの公開鍵格納ディレクトリ/home/sftpuser/.ssh/パーミッションは 700 にします
SFTP ユーザの公開鍵ファイル/home/sftpuser/.ssh/authorized_keysパーミッションは 600 にします
Chroot 先ディレクトリ/var/www/今回は Chroot もします

SFTP クライアント
種類内容備考
WindowsWindows10 (1803)本稿記述時の最新版
ファイル転送アプリWinSCP 5.13.4(ビルド 8172)本稿記述時の最新版
秘密鍵・公開鍵を作成するフォルダPC > ドキュメント > PubKeys実フォルダは
C:\Users\UserName\Documents\PubKeys\*1
秘密鍵のファイル名sftpuser.ppkWinSCP のログイン時に使用する
秘密鍵のパスフレーズ(なし)今回はパスフレーズを設定しません
公開鍵のファイル名sftpuser.txt接続先サーバの .ssh/authorized_keys に追記する(加工してから)
*1 UserName は、Windows のユーザ名を指します。

1. SSH サーバを設定
1-1. Chroot 先ディレクトリのパーミッションを確認する
$ ls -ld /var/www
drwxr-xr-x. 8 root root 4096 3月 22 15:53 2017 /var/www
ユーザ、グループが root:root でパーミッションが 755 (Group と Other に Write の権限がない) なので OK
1-2. SSH サーバの設定に公開鍵の許可がされているか確認する
$ ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
$ su
# cat /etc/ssh/sshd_config | egrep '(PubkeyAuthentication|AuthorizedKeysFile)'
#PubkeyAuthentication yes 公開鍵のログインを受け付ける*2
AuthorizedKeysFile .ssh/authorized_keys 公開鍵を格納するファイル名*3
*2 PubkeyAuthentication は省略時に yes が設定されます。つまり意図的に no が指定されていなければ OK。
*3 各ユーザのホームディレクトリが省略されているので、今回は /home/sftpuser/.ssh/authorized_keys となります。
1-3. ファイル転送専用ユーザ用の設定をする
# vi /etc/ssh/sshd_config
internal-sftp を登録する。(Chroot するので)
# override default of no subsystems
#Subsystem      sftp    /usr/libexec/openssh/sftp-server
Subsystem       sftp    internal-sftp
Subsystem sftp はひとつしか登録できないので、既存定義は無効にする。
以下を追記する
Match Group sftponly
    ChrootDirectory /var/www/
    ForceCommand internal-sftp
    PasswordAuthentication no
*4大文字/小文字を区別します。Group は group の記述では不可。

↑ ここではグループでの指定を行っています。グループとユーザの両方を設定する場合は、以下のように指定します。
Match Group sftponly User sftpuser,sftpuser2
    ChrootDirectory /var/www/
    ForceCommand internal-sftp
    PasswordAuthentication no
*5 sftpuser2 については、今回取り扱いません。
1-4. sshd を再起動する。(sshd_config を更新したので)
# sshd -t     # 定義に誤りがないか、チェックする。
# systemctl restart sshd

2. ファイル転送専用ユーザを作成
2-1. グループを作成する
# groupadd -g 2000 sftponly
2-2. ユーザを作成する (公開鍵ログインだけにするため、ログインパスワードは設定しない)
# useradd -g sftponly sftpuser
# usermod -s /sbin/nologin -p '*' sftpuser    # 通常のログインは禁止。パスワードフィールドに「*」を設定する。(何も設定しないとロックされているとみなされる)
# passwd sftpuser            # ← パスワードは設定しない
# usermod -d / sftpuser    # ← ホームディレクトリを変更すると .ssh/authoroized_keys が使用不能になる

3. WinSCP のインストール
3-1. WinSCP をダウンロードする
通常は WinSCP の公式サイト からダウンロードしますが、今回は窓の杜の WinSCP の紹介ページからダウンロードします。
(Google で検索すると、公式サイトより窓の杜のほうが先に表示されるため)
3-2. WinSCP をインストールする
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. 秘密鍵・公開鍵の作成
4-1. WinSCP を起動する

4-2. ログインウィンドウから「ツール(T)」-「PuTTYgen を実行(G)」を選択し、「PuTTY Key Generator」を開く

4-3. 「PuTTY Key Generator」ウィンドウで ボタンをクリックすると、ランダムキーの生成が開始されるので、
中段のフィールドでマウスを適当に動かす(プログレスバーがいっぱいになるまで)

4-4. ランダムキーの生成により、秘密鍵・公開鍵が作成されるので、それぞれをファイルに保存する。
秘密鍵の保存時には Key passphrase (パスフレーズ: パスワードのこと) を指定することができる。

秘密鍵はコピーすると誰でも使えてしまうため、
Windows を共有アカウントで使用している場合は、必ずパスフレーズを設定すること

ここでは「Key passphrase:」を未記入にしている (←非推奨) ので警告ウィンドウが表示される。

作成された秘密鍵・公開鍵を両方とも保存する。
(どちらが先でも構わないが、両方保存する)
秘密鍵の保存: ボタンをクリックする -> 4-5 へ
公開鍵の保存: ボタンをクリックする -> 4-6 へ

警告ウィンドウ
4-5. 秘密鍵の保存
上記 4-4 ボタンをクリックするとファイル保存のウィンドウが表示されるので、
フォルダとファイル名を指定し ボタンをクリックする。

保存フォルダPC > ドキュメント > PubKeys
保存ファイルsftpuser.ppk


4-6. 公開鍵の保存
上記 4-4 ボタンをクリックするとファイル保存のウィンドウが表示されるので、
フォルダとファイル名を指定し ボタンをクリックする。

保存フォルダPC > ドキュメント > PubKeys
保存ファイルsftpuser.txt

4-7. 鍵生成の終了
メニュー「File」-「Exit」を選択し、PuTTY Key Generator を閉じる



5. 公開鍵をサーバへ設置
5-1. 公開鍵を加工する
上記 4-6 で作成した公開鍵を以下のように 1 行に加工する。

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 ' を挿入する)
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAsGYL5EHQot(~長いので省略~)H1g1fXrQEEKSIeP0CRGLByaeis2x20MLGCgHRQ==
*6ページの都合上、(~長いので省略~) と記述していますが、実際に省略してはいけません。
5-2. 公開鍵を格納するディレクトリとファイル (空っぽでも良い) を作成する。
# mkdir /home/sftpuser/.ssh
# 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
5-3. 上記 5-1 で加工した公開鍵を公開鍵ファイルに追記する。
# cat >> /home/sftpuser/.ssh/authorized_keys << EOF
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAsGYL5EHQot(~長いので省略~)H1g1fXrQEEKSIeP0CRGLByaeis2x20MLGCgHRQ==
EOF

6. ログイン情報の作成
6-1. WinSCP を起動する

6-2. ログインウィンドウの左ペインで「新しいサイト」を選択し、「セッション」と「認証」に以下を設定する
セッション転送プロトコル(F)SFTP
ホスト名(H)192.168.56.102
ポート番号(R)22
ユーザ名(U)sftpuser
パスワード(P)(記入しない)
認証秘密鍵(K)C:\Users\UserName\Documents\PubKeys\sftpuser.ppk*7
*7 UserName は、Windows のユーザ名を指します。

をクリックして「高度なサイトの設定」を表示する

 ↓
左ペインの「SSH」-「認証」を選択し、
右ペインの「秘密鍵」に sftpuser.ppk (上記 4-5 で作成したファイル)
を指定して ボタンをクリックする。

 ↓
「ログイン」ウィンドウに戻るので、セッション情報を記入し、 ボタンをクリックする。

 ↓
保存名の確認ウィンドウ
ボタンをクリックして保存する。

 ↓
ログイン情報の保存完了。
ボタンをクリックしてログインウィンドウを閉じる。


7. 公開鍵を利用してログイン
7-1. WinSCP を起動し、作成したログイン情報を使用してログインする。
上記 6 で作成したログイン情報が表示されているので、これを選択し、 ボタンをクリックする。

 ↓
初めてログインするサーバのホストの公開鍵は WinSCP に未登録のため、 ボタンをクリックして接続先サーバの公開鍵を取り込む。

一度取り込めば、次回からは警告が表示されない。

ただし、何らかの原因で接続先サーバの公開鍵が変更されると、同じような警告が表示される。


秘密鍵にパスフレーズを設定した場合
上記 4-4 で Key passphrase にパスフレーズを記入した場合は、このウィンドウが表示される。
設定したパスフレーズと同一の文字列を記入して ボタンをクリックする。

Key passphrase は秘密鍵にパスワードをかけるもので、付けたり外したりできる。
秘密鍵のパスフレーズを変更/削除する場合
パスワードの付け外しは「PuTTY Key Generator」(上記 4-4) を表示して以下のようにする。
このとき公開鍵は変更されないので、改めてサーバに登録する必要はない。
1. 秘密鍵を読み込む ( ボタン)
2. パスワードを変更する (Key passphrase を変更 / 削除)
3. 秘密鍵を保存する ( ボタン)
7-3. ログイン成功
例として作成しておいた
  /var/www/www.example.com/ (775)
が、(Chroot しているため)
  /www.example.com/
として見えている。
Chroot ディレクトリのパーミッションは 755 の必要があるため、管理者以外に書き込みを許可する場合は、この例のように書き込みを許可したサブディレクトリを使用する。