クライアントとサーバーで公開鍵認証を使用した SFTP のセットアップと動作確認を行う
現在表示しているページは選択中の表示言語には対応しておりません。
環境
- Windows
-
- Windows 10 Pro
- Windows Server 2019
- Windows 7
- Windows Server 2012 R2
- OpenSSH
-
- 7.7p1
- 8.1p1 - Beta
※他のバージョンでも動作しますが未確認です
はじめに
前回は SFTP サーバーのセットアップを行い、パスワード認証によってファイルの送受信ができることを確認しました。 今回は公開鍵認証を使用して SFTP によるファイルの送受信を行います。
事前準備
- クライアントに OpenSSH クライアントがインストールされていること
- サーバーに OpenSSH サーバーがインストールされていること
- サーバーで OpenSSH のサービスが起動し、22番ポートが解放されていること
クライアントで秘密鍵と公開鍵を作成する
クライアントにログインします。 秘密鍵と公開鍵はサーバー側でも作成することができますが、秘密鍵はクライアント、公開鍵はサーバーが持つことになりますので クライアント側で作成します。
PowerShell を管理者権限で起動します。
ファイルを作成しますので cd コマンドで任意のフォルダに移動し、以下のコマンドを入力します。
ssh-keygen -t rsa -f id_rsa
鍵にはパスフレーズ(パスワード)を入れられますので必要であれば入れてください。
鍵の生成に成功すると以下のように表示され、フォルダに公開鍵と秘密鍵が作成されます。 「id_rsa」が秘密鍵で「id_rsa.pub」が公開鍵です。
サーバーに公開鍵を配置する
サーバーに対し SFTP のアカウントで Windows にログインします。
作成した公開鍵「id_rsa.pub」をサーバーの以下のフォルダに配置して下さい。 「.ssh」フォルダがない場合は作成してください。また、ファイル名は「authorized_keys」に変更してください。 (<>の部分は SFTP でログインするユーザー名に置き換えてください)
- C:\Users\<ユーザー名>\.ssh
注意点としてはこのファイルにアクセスできるユーザーは「administrators」権限を持つユーザーか SFTP ユーザーのみにする必要があります。 それ以外のユーザーにアクセス権限がついていると SFTP の接続は必ず失敗します。 例えば権限に「Users」や「Everyone」のグループが付加されていると NG です。
今回の例の場合、「.ssh」フォルダのアクセス権限は「グループ:SYSTEM」「グループ:Administrators」「ユーザー:sftptest」にしています。 権限を削除できない場合は権限の継承を無効化してください。
サーバーで公開鍵認証を有効にする
Administrators の権限のユーザーでサーバーにログインし、以下のフォルダを開きます。
- C:\ProgramData\ssh
「sshd_config」というファイルがあるのでコピーしてファイル名を「sshd_config_default」に変更しバックアップを取っておきます。
管理者権限で起動したテキストエディタで「sshd_config」を開きます。
公開鍵認証を有効にするには以下のように変更します。
#PubkeyAuthentication yes
↓↓↓
PubkeyAuthentication yes
また、既定ではパスワード認証が有効になっているので、無効にしたい場合は以下のように変更します。
#PasswordAuthentication yes
↓↓↓
PasswordAuthentication no
SFTP のアカウントごとに公開キーを配置したいので以下の行をコメントアウトします。
Match Group administrators
AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
↓↓↓
#Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
SFTP のアカウントごとにルートディレクトリを指定したい場合は以下の行を追加します。 これを指定するかしないかで、クライアントからフォルダパスを指定したときに「C:\xxxxx」形式になるか「/xxxxx」形式になるか変わる場合があります。
Match User <ユーザー名>
ChrootDirectory <フォルダパス>
例
Match User TestUser
ChrootDirectory C:\Users\TestUser
「sshd_config」を保存したら OpenSSH サーバーを再起動します。
クライアントから公開鍵認証でファイルを送受信する
SFTP で接続する前に作成した秘密鍵「id_rsa」を、SFTP を実行するユーザーのみがアクセスできるフォルダに配置します。 他のユーザーにもアクセスできるフォルダに配置していると SFTP の接続に失敗するので注意してください。 特にフォルダに「Users」「Everyone」グループの権限がついていると NG です。
基本的には以下のフォルダに入れておくと自動的にパスを参照してくれるので推奨です。
- C:\Users\<ユーザー名>\.ssh
クライアントの「.ssh」フォルダのアクセス権限は「グループ:SYSTEM」「グループ:Administrators」「ユーザー:<ログインユーザー>」にしています。
秘密鍵を使用して SFTP でアクセスする場合は以下のようにコマンドを入力します(<>の部分は置き換えてください)。 パスフレーズを設定している場合はパスフレーズも入力します。
sftp -i id_rsa <ユーザー名>@<サーバー名>
ログインに成功するとログイン先ユーザーの表示に切り替わります。
こちらも dir コマンドなどでログイン出来ていることが確認できます。
「test3.txt」といファイルを用意したので put コマンドでファイルを送信します。
put c:\temp\test3.txt
サーバー側の「C:\Users\sftptest」フォルダを見てみると test3.txt ファイルが送信されていることを確認できます。
クライアントから get を試してみます。
get test3.txt c:\temp\test4.txt
ファイルが取得できたことを確認出来ました。
まとめ
公開鍵認証を使用して SFTP によるファイルの送受信を行うことができました。 公開鍵を使用することによってサーバー側にもパスワードを知られることがなくなりますので パスワード認証よりもより安全にファイルのやり取りを行うことができます。