OpenSSH を使用したEC2のWindowsサーバーを用いて、 ローカルPCから SFTPで接続する構築

# はじめに
題名の通り、EC2のwindowsサーバーに対して、ローカルPCからSFTP接続でファイル転送ができる構築を作成する方法についてです。
windowsサーバーの構築については、下記の記事で説明しています。

①

https://qiita.com/holdout0521/items/909f97cb0947bcec2eac

②

https://qiita.com/holdout0521/items/74064fe956534fe5a8a5

# 流れ
1. 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 クライアントが初期インストールされているはずなので、以下の記事を参考に、確認しましょう。
インストールされていない場合も、参考になります。

https://sorceryforce.net/ja/tips/sftp-setup-client-open-ssh-windows

## OpenSSHサーバーをインストール

こちらの記事通りにインストールしましょう。

https://sorceryforce.net/ja/tips/sftp-setup-server-open-ssh-windows

## OpenSSH SSH サーバーを起動

https://sorceryforce.net/ja/tips/sftp-setup-open-ssh-password

公開鍵認証を使用したSFTP接続するため、記事の`SSH サービスの起動設定`ところまで進めましょう。

:::note warn
リモート環境の場合は 、SFTPユーザー対し、`Remote Desktop Users` の権限を付加を忘れないようにしましょう。
:::

## 公開鍵認証作成

秘密鍵と公開鍵を作成します。

PowerShell を管理者権限で起動します。

![スクリーンショット 2021-12-06 21.52.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/30f5c46c-24a2-56e3-c12c-8377d14b0506.png)

任意のパスで以下のコマンドで鍵を作成します。
鍵の名前は、`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`配下に設置して下さい。 


また、
![スクリーンショット 2022-03-22 12.10.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/4141c7eb-09e2-b4d6-5ab1-dfd7b207bdf7.png)


authorized_keys の権限は、他人から読み込みのみ可にし、書き込みは、sftpユーザーのみにしてください。
`「アクセスを許可する」→「特定のユーザー...」`をクリックすると、「共有する相手を選んでください」に遷移します。


![スクリーンショット 2022-03-22 12.13.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/8fedfd2d-c6ca-b0c2-54e3-960c727ed6b4.png)
![スクリーンショット 2022-03-22 12.15.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/adcce0d5-adad-15e5-e351-3839be913be8.png)

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

今回の場合、「.ssh」フォルダのアクセス権限は、「ユーザー：sftptest」のみにしています。 
:::

`id_rsa`ファイルは、ローカルPCに渡します。

## sshd_configファイル修正



`C:\ProgramData\ssh`配下に、`sshd_config`ファイルがありますので、コピーして修正しましょう。
`ProgramData`ディレクトリは隠しフォルダなので、エクスプローラーの上部タブから`隠しファイル`にチェックすると見えます。
![スクリーンショット 2021-12-06 22.47.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/74bb6dfa-c04b-e8a0-6d84-2f5be04675a0.png)

5箇所修正します

```config:C\ProgramData\ssh\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 のアカウントごとにルートディレクトリを指定したい場合は以下の行を追加します。 
#ChrootDirectoryは、sftpでログイン時のルートディレクトリを指定します。
#今回は、C:を指定しました。
Match User <ユーザー名>
       AuthorizedKeysFile .ssh/authorized_keys
       ChrootDirectory C:

~⑤~
#パーミッションエラーの詳細なログ出力設定
# Logging
#SyslogFacility AUTH
#LogLevel INFO
SyslogFacility LOCAL0
LogLevel DEBUG3
```

`sshd_config`を保存したら OpenSSH サーバーを再起動します。

![スクリーンショット 2021-12-06 22.30.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/10663159-ee64-ea2e-8c12-4d2d41e80bef.png)

ローカル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を再起動すると、設定が反映されます。

# 参考

https://takuya-1st.hatenablog.jp/entry/2021/03/04/065504