クライアントとサーバーで公開鍵認証を使用した 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 を管理者権限で起動します。

image

ファイルを作成しますので cd コマンドで任意のフォルダに移動し、以下のコマンドを入力します。

ssh-keygen -t rsa -f id_rsa

鍵にはパスフレーズ(パスワード)を入れられますので必要であれば入れてください。

image

鍵の生成に成功すると以下のように表示され、フォルダに公開鍵と秘密鍵が作成されます。 「id_rsa」が秘密鍵で「id_rsa.pub」が公開鍵です。

image

image

サーバーに公開鍵を配置する

サーバーに対し SFTP のアカウントで Windows にログインします。

作成した公開鍵「id_rsa.pub」をサーバーの以下のフォルダに配置して下さい。 「.ssh」フォルダがない場合は作成してください。また、ファイル名は「authorized_keys」に変更してください。 (<>の部分は SFTP でログインするユーザー名に置き換えてください)

  • C:\Users\<ユーザー名>\.ssh

image

注意点としてはこのファイルにアクセスできるユーザーは「administrators」権限を持つユーザーか SFTP ユーザーのみにする必要があります。 それ以外のユーザーにアクセス権限がついていると SFTP の接続は必ず失敗します。 例えば権限に「Users」や「Everyone」のグループが付加されていると NG です。

今回の例の場合、「.ssh」フォルダのアクセス権限は「グループ:SYSTEM」「グループ:Administrators」「ユーザー:sftptest」にしています。 権限を削除できない場合は権限の継承を無効化してください。

サーバーで公開鍵認証を有効にする

Administrators の権限のユーザーでサーバーにログインし、以下のフォルダを開きます。

  • C:\ProgramData\ssh

「sshd_config」というファイルがあるのでコピーしてファイル名を「sshd_config_default」に変更しバックアップを取っておきます。

image

管理者権限で起動したテキストエディタで「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 サーバーを再起動します。

image

クライアントから公開鍵認証でファイルを送受信する

SFTP で接続する前に作成した秘密鍵「id_rsa」を、SFTP を実行するユーザーのみがアクセスできるフォルダに配置します。 他のユーザーにもアクセスできるフォルダに配置していると SFTP の接続に失敗するので注意してください。 特にフォルダに「Users」「Everyone」グループの権限がついていると NG です。

基本的には以下のフォルダに入れておくと自動的にパスを参照してくれるので推奨です。

  • C:\Users\<ユーザー名>\.ssh

クライアントの「.ssh」フォルダのアクセス権限は「グループ:SYSTEM」「グループ:Administrators」「ユーザー:<ログインユーザー>」にしています。

秘密鍵を使用して SFTP でアクセスする場合は以下のようにコマンドを入力します(<>の部分は置き換えてください)。 パスフレーズを設定している場合はパスフレーズも入力します。

sftp -i id_rsa <ユーザー名>@<サーバー名>

image

ログインに成功するとログイン先ユーザーの表示に切り替わります。

image

こちらも dir コマンドなどでログイン出来ていることが確認できます。

image

「test3.txt」といファイルを用意したので put コマンドでファイルを送信します。

put c:\temp\test3.txt

image

サーバー側の「C:\Users\sftptest」フォルダを見てみると test3.txt ファイルが送信されていることを確認できます。

image

クライアントから get を試してみます。

get test3.txt c:\temp\test4.txt

image

ファイルが取得できたことを確認出来ました。

image

まとめ

公開鍵認証を使用して SFTP によるファイルの送受信を行うことができました。 公開鍵を使用することによってサーバー側にもパスワードを知られることがなくなりますので パスワード認証よりもより安全にファイルのやり取りを行うことができます。