はじめに
題名の通り、EC2のwindowsサーバーに対して、ローカルPCからSFTP接続でファイル転送ができる構築を作成する方法についてです。
windowsサーバーの構築については、下記の記事で説明しています。
①
②
流れ
- EC2を起動設定
- Windowsサーバーにリモートデスクトップで接続する
- 日本語設定と時計合わせ
- Visual Studio Codeをインストール
- ApacheとVisual C++ ランタイムのインストール
- Apacheの起動
↑①ではここまで
- PHPインストールし、Web上で確認
- RDSの起動
- composerとlaravelインストール
- プロジェクトを作成し、laravelページをWeb上で確認
- phpmyadminインストールし、Web上で確認
↑②ではここまで
- OpenSSH を使用して Windows に SFTP サーバーをセットアップ
←今回の内容!
OpenSSH を使用して Windows に SFTP サーバーをセットアップ
Windows に SFTP クライアントをインストール
Windows10には、OpenSSH クライアントが初期インストールされているはずなので、以下の記事を参考に、確認しましょう。
インストールされていない場合も、参考になります。
OpenSSHサーバーをインストール
こちらの記事通りにインストールしましょう。
OpenSSH SSH サーバーを起動
公開鍵認証を使用したSFTP接続するため、記事のSSH サービスの起動設定
ところまで進めましょう。
リモート環境の場合は 、SFTPユーザー対し、Remote Desktop Users
の権限を付加を忘れないようにしましょう。
公開鍵認証作成
秘密鍵と公開鍵を作成します。
PowerShell を管理者権限で起動します。
任意のパスで以下のコマンドで鍵を作成します。
鍵の名前は、id_rsa
でなく任意の名前で問題ありません。
C:\> ssh-keygen -t rsa -f id_rsa
フォルダに公開鍵と秘密鍵が作成されます。 id_rsa
が秘密鍵でid_rsa.pub
が公開鍵です。
sftpユーザーでログインし、公開鍵を配置
Administratorでログインしている場合、ログアウトします。
そして、sftpユーザのアカウント
で Windowsサーバーに対し、RDP接続しログインします。
SFTPユーザーででログインすると、以下のフォルダが作成されているはずです。
C:\Users\<ユーザー名>.EC2AMAZ-<ランダムな文字列7>
C:\Users\<ユーザー名>.EC2AMAZ-<ランダムな文字列7>
配下に.ssh
フォルダがない場合、作成してください。
作成した公開鍵id_rsa.pub
のファイル名をauthorized_keys
に変更し、
C:\Users\<ユーザー名>.EC2AMAZ-<ランダムな文字列7>\.ssh
配下に設置して下さい。
authorized_keys の権限は、他人から読み込みのみ可にし、書き込みは、sftpユーザーのみにしてください。
「アクセスを許可する」→「特定のユーザー...」
をクリックすると、「共有する相手を選んでください」に遷移します。
authorized_keysファイルにアクセスできるユーザーは、「administrators」権限を持つユーザー
か SFTP ユーザー
のみにする必要があります。
それ以外のユーザーにアクセス権限がついていると SFTP の接続は必ず失敗します。
例えば権限に「Users」や「Everyone」のグループが付加されていると NG です。
今回の場合、「.ssh」フォルダのアクセス権限は、「ユーザー:sftptest」のみにしています。
id_rsa
ファイルは、ローカルPCに渡します。
sshd_configファイル修正
C:\ProgramData\ssh
配下に、sshd_config
ファイルがありますので、コピーして修正しましょう。
ProgramData
ディレクトリは隠しフォルダなので、エクスプローラーの上部タブから隠しファイル
にチェックすると見えます。
5箇所修正します
~①~
#公開鍵認証を有効にするには以下のように変更します。
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 のアカウントごとにルートディレクトリを指定したい場合は以下の行を追加します。
#ChrootDirectoryは、sftpでログイン時のルートディレクトリを指定します。
#今回は、C:を指定しました。
Match User <ユーザー名>
AuthorizedKeysFile .ssh/authorized_keys
ChrootDirectory C:
~⑤~
#パーミッションエラーの詳細なログ出力設定
# Logging
#SyslogFacility AUTH
#LogLevel INFO
SyslogFacility LOCAL0
LogLevel DEBUG3
sshd_config
を保存したら OpenSSH サーバーを再起動します。
ローカルPCから以下の4つのログイン情報を使い、filezila等でsftp接続し、windowsサーバーにファイル転送できました!
・ ip:サーバーのipアドレス
・ ポート:22
・ ユーザー名:先程作成した名前
・ キー:id_rsa
ちなみに、ローカルPCからWindowsサーバーにSSH接続も可能です。
sftp接続エラー①
まずログファイルを確認しましょう。
私の場合、ログに以下のエラーが出ました。
'C:\\Users\\test.EC2AMAZ-T4V3DFA\\.ssh/authorized_keys'にauthorized_keysがありません!
見てみると、C:\Users\test\.ssh
配下にauthorized_keys
を置いていたのですが、C:\Users\test.EC2AMAZ-T4V3DFA\
というフォルダが作成されておりました。
test.EC2AMAZ-T4V3DFA
配下に、authorized_keys
を置くとうまくログインできました。
おそらくEC2サーバーの仕業ですが、なぜ作られたのか、謎です。
sftp接続エラー②
それでもエラーになる場合、以下の2点を確認してみましょう。
php.ini
にextension=ssh2
を追記
php_ssh2.dll
がc:\php8\ext
配下にあるか確認する
PATHが通らない場合
c:\Apache24\htdocs\automeasure>php -v
'php' is not recognized as an internal or external command,
operable program or batch file.
PATHが通らない場合、Open SSH Serverを再起動すると、設定が反映されます。
参考