素人「雨が降ってむしゃくしゃしたので、SNSのWebアプリつくるしかない」2/n回

# はじめに
表題の件ですが、つまり、未経験者が転職用のポートフォリオとして、JSP・サーブレットを使用し、土木向けSNSWebアプリ（オンライン公開予定）を作っている連載です。
第1回はこちら
https://qiita.com/necofuwafuwa/items/fc014d1e99e52de617f4

## 余談
第1回の記事を推敲している間に、
+ GitHubやIDE euripusの環境整える
+ JSPとサーブレットのフォワード、リダイレクト、スコープ、MVCモデル等について学ぶ
+ 必要な画面（JSPで書くことになるページ）をリストアップ、遷移図を雰囲気でメモ
+ フォルダ構成を雰囲気でメモ
+ 「堂々完成予定」と書かれた仮のindex.jspが完成

といったことが終わりました。**考えをまとめ、日本語に出力することが難しすぎる。**
# ここまでの学びについてのメモ
+ JSP(View)で作られた画面をユーザーが操作 ⇒ JSPがサーブレット(Controller)を呼ぶ ⇒ 処理やデータ格納がある場合はサーブレットがJavaBeans(Model)に依頼する ⇒ サーブレットがJSPを呼び出し、ユーザーに結果を表示する（フォワードまたはリダイレクト）
+ インスタンスは必要に応じてリクエスト、セッションスコープに保存すると他のJSP、サーブレット、JavaBeansが使用できる
## 使用したツール
+ 画面遷移図、フォルダ管理：miro
+ タスク管理：Notion
# いよいよVPSの導入
検索エンジンのクローラーに拾ってもらうため、仮ページでいいから仮置きせねばなりません。ということで仮ページをおくためにVPS環境を構築します。

ひとまずconoHaVPSに登録、サーバ設置完了。
+ OS Ubuntu24.04
+ メモリ 1GB/CPU 2Core

OSはちょっとだけ使ったことがあったため。
メモリはさくらインターネットのサイトを参考にとりあえず設定。Ubuntuの最低要件も満たしています。必要があればスケールアップするということで。

参考：ネコでもわかる！さくらのVPS講座 〜第一回：VPSてなんだろう？〜
https://knowledge.sakura.ad.jp/7938/?_gl=1*xnvkc1*_gcl_au*MTk2NjIyODY3OC4xNzMxOTA0Mjcy#VPS-3
# SSH初期設定
初期設定で何をした（またはしている）かというと、主にSSH（自宅パソコンからVPSにアクセスする）に関する設定です。
conoHaVPSサイトにやり方書いてあるのですが（ご利用ガイド SSH接続でVPSにログインする : https://support.conoha.jp/v/vps_ssh/ ）、SSHクライアントソフト使わないやり方をとりたくて（仕組みを知りたいとか自分で触りたいとか）、調べつつコマンドプロンプト叩きつつ進めました。

※要所要所参考にしたサイトはそれぞれの場面に記載していますが、全般的に参考にしたサイトは最後にまとめています。
## めっちゃ大きな学び
**自分が今なんの設定やったのかメモった方がいい**（ほんまに）
何にトライしてエラー（またはクリア）したのかメモするべき。自戒。
そしてそれは手元のメモではなく、**人に読ませる文章として書くべき**。なぜなら未来の自分は他人なので。おけるならQiitaなどの公の場に置くと人に読ませようと努力するのでそれが良いですね。

（メモをしていなかったため、うまくいかなかったときに自分が何を書き換えたのか確認に行く作業を何度か行うことになりました）
## 登場人物
クライアント（自宅パソコン側）：Windows11
サーバー（VPS）：Ubuntu24.04
## パッケージのバージョンアップ
サーバーの方で、root（管理者）でログインします。パスワードは数すら表示されないので打ち間違えたらバックスペースを連打。
Ubuntunに含まれるソフトウェアのパッケージをバージョンアップしておきます。
```
$ apt update
$ apt upgrade
```
## 一般ユーザーの作成
そのままサーバー、rootにて、一般ユーザーの登録、登録した一般ユーザーがsudoコマンド（sudo使用時、デフォルトだとroot権限が使用可能）が利用できるようにします。
```
$ adduser [一般ユーザー名]
$ gpasswd -a [一般ユーザー名] sudo
```
設定したらログアウトして、一般ユーザーとしてログイン、以降は「sudo」コマンドを頭に着けて操作します。
## SSH接続からのrootログインの阻止
つまりVPSの外からだと、「一般ユーザー」が「sudoを使用」しなければ「root操作はできない」という状態にしたい。
ここでポイントなのは**Ubuntu22.10以降についてそれ以前に対しSSHに関する設定でいじる場所が違う**ということ（というかUbuntuがSSHを使用する際に優先的に読みこむ場所が変わったそうです）
以前は「/etc/ssh/sshd_config」で変更を行っていたようですが、使用するバージョンだと、「/etc/ssh/sshd_config.d」に「conf」拡張子ファイルがあった場合優先してそちらが読み込まれるようですね。
サーバーのほう、一般ユーザーのままで、confファイルに「PermitRootLogin yes」という記載があるか確認し、「PermitRootLogin no」に書き換えます。

confファイルがあるか確認します。
```
$ ls /etc/ssh/sshd_config.d
```
confファイルの中身を確認します。
```
$ cat /etc/ssh/sshd_config.d/[ファイル名]
```

「PermitRootLogin」に関する記載がある「conf」ファイルがなかったため、新しく作成、編集。（名前は何でもよい）
（追記：これconfファイルなかったらsshd_configの方が読まれるのでsshd_configの編集でも良かったかもしれない）
```
$ sudo mkdir /etc/ssh/sshd_config.d/[ファイル名]
$ sudo vim /etc/ssh/sshd_config.d/[ファイル名]
```
「PermitRootLogin no」とだけ記載。
vimは「escキー」を押して、「i」を押して編集（別途押す）、「escキー」と「:wq」で上書き保存。
SSHサーバーを再起動します。
```
$ sudo systemctl restart ssh
```
## ポート番号の変更
以前は「/etc/ssh/sshd_config」で変更を行っていたそうなのですが、今回は「ssh.socket」の内容を変更します。（そちらが優先的に読まれるため）
サーバーのほう、一般ユーザーのままで書き込んでいきます。
```
$ sudo systemctl edit ssh.socket
```
以下、[Socket]~[任意の番号]までを追加。この「### Anything between」～「### Edits below」で囲まれた部分がオーバーライド（上書き）されるようなのでここに記載。
[任意の番号]はポート番号でほかの自サービスと被らなければなんでもよいそう。デフォルト「22」だとボットに抜かれやすいらしい。なるほど。
```
### Anything between here and the comment below will become the contents of the drop-in file

[Socket]
ListenStream=
ListenStream=[任意の番号]

### Edits below this comment will be discarded
```
変更を更新。再起動。
```
$ sudo systemctl restart ssh.socket
$ sudo systemctl restart ssh
```
## ファイアーウォールの設定
通信の制限をしてくれる、ファイアーウォールを有効にします。
こちらもサーバーの方、一般ユーザーにて。
```
$ sudo ufw enable
```
さっき追加したポート番号の使用を許可してもらい、許可が追加されているか確認します。
```
$ sudo ufw allow [追加したポート番号]/tcp
$ sudo ufw status
```
デフォルトのポート番号使用の許可を削除し、削除されているか確認します。
```
$ sudo ufw delete allow 22
$ sudo ufw status
```
ファイアーウォールの設定を再読み込み。
```
$ sudo ufw reload
```
上記作業をすべて終えていったんサーバーの再起動。
```
$ sudo reboot
```
## conoHaVPS側のセキュリティ設定
ここでクライアント（自分のパソコン）に移り、SSH接続をします。
+ 設定したポートでSSH接続ができること
+ 22ポートでSSH接続ができないこと
+ rootアカウントで接続ができないこと
を確認します。

全てのケースにおいて接続できない！なんでだ。タイムアウトになる。

素人ありがちやらかし、うっかりをやったのではとか、バージョンアップでさらに変更があったのではとかいろいろ調べた結果、そもそも**conoHaVPS側のセキュリティ設定でSSHを許可していない**（なんなら設定したポートはもちろん許可していない）ことに気づきました。
ほぼ以下のサイトの通りに設定を行い、そのうえでポート番号を「22」でなく設定したポート番号に設定。
登録した一般ユーザーによる設定したポート番号へのSSH接続を行うことができ、他上記3点の確認を行うことができました。

参考：ConoHa VPSでPingがtimeoutしてしまう/SSHで繋がらない際の解決法
https://qiita.com/plnnano/items/d55b8d76ec010bc9ce85
## 公開鍵認証
クライアント（自分のパソコン）に切り替えて鍵を作ります。ユーザーディレクトリ直下に「.ssh」というフォルダを作り、公開鍵と秘密鍵を作ります。
ed25519は鍵のタイプ。
```
$ cd ~
$ mkdir .ssh
cd .ssh
ssh-keygen -t ed25519 -f [鍵の名前]
```
passphraseの記入を求められますが、何食わぬ顔でenterを押すことでスルーも可能。設定した方がよりセキュリティ的に安全側。
「.ssh」ディレクトリ内の[鍵の名前].pubが公開鍵、[鍵の名前]のみのファイルが秘密鍵。

サーバー（VPS）側に行き、公開鍵の保管場所を作ります。
```
$ mkdir .ssh
$ chmod 700 .ssh
```
chmodは不正アクセス対策、編集権限を設定しています。

参考：chmod 600 ←600ってなんやねん
https://qiita.com/aaabb6211/items/30ddad48773f37affcb9

クライアントから公開鍵をサーバーに移動させ、名前も「authorized_keys」に変更します。
```
~/.ssh $ scp -P [VPSポート番号] [鍵の名前].pub [VPS一般ユーザー名]@[VPSのIPアドレス]:~/.ssh/authorized_keys
```
サーバー側で編集権限を設定。
```
~/.ssh $ chmod 600 authorized_keys
```
クライアントからサーバーへSSH接続する際にパスワードログインを無効、公開鍵認証を有効にします。
サーバーの「sshd_config」ファイルの中身をいじります。（追記：本当は編集するなら複製して残した方が良かった）
```
$ sudo vi /etc/ssh/sshd_config
```
以下、「#」でコメントアウトされている部分の「#」を消し文を有効に、その後yes or no設定します。
```
PasswordAuthentication no
ChallengeResponseAuthentication no
PubkeyAuthentication yes
KbdInteractiveAuthentication no
```
上から
・パスワード認証無効
・パスワード以外の認証方法の無効
・公開鍵認証の有効
・キーボードインターフェースによる認証の無効

システムを再起動します。
```
$ sudo systemctl restart sshd
```

参考：sshdでパスワードログインを禁止する
https://geroforce.hatenablog.com/entry/2019/06/15/220821
参考：Ubuntu Serverのsshd_configデフォルト設定ガイド
https://qiita.com/YukiTetsuka/items/b1ed9942aa139c530f11

クライアント側でSSH接続をしてみます。
```
$ ssh -P [VPSのポート番号] -i [秘密鍵の名前] [VPS一般ユーザー名]@[VPSのIPアドレス]
```
公開鍵認証は出来たらしい。しかし、何故かパスワードを求められる。
首をひねりつつ、思い当たるのは「ssh_config.d」のconfファイルに記載があるのではないかということ。

見に行ったら案の定生き残りの「PasswordAuthentication」。これを「no」にすると上記公開鍵認証のみでログインができるようになりました。
## SSH接続を簡単にするconfigファイル作成
SSH接続するたびに上記長文コマンドを打つのを簡略化したい。
ということで、クライアント（自分のパソコン）側の「.ssh」フォルダ（鍵たちがいるところ）にconfigファイルを作ります（拡張子なしで「config」）。
大体以下のサイトの通りにconfigファイルの中身を作成しました。

参考：~/.ssh/configを使ってSSH接続を楽にする
https://tech-blog.rakus.co.jp/entry/20210512/ssh#%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%88%A5%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB
参考：Windows10のOpenSSHでconfig使ってSSH接続
https://meshikui.com/2018/09/11/949/

これのおかげでクライアント側から省略した呪文でSSH接続することができます。
```
$ ssh [設定した接続先名(Host)]
```

以上でSSHに関する初期設定は終了になります。
次回は完成した「index.jsp」ファイルをVPSにアップし、インターネットの海から閲覧できるようにVPSの環境を整えるところからですね。
11月中に終わるのか。頑張ります。

# 全体的に参考
【Ubuntu】ConoHaのVPSを作成した時にはじめにやること
https://vpslife.server-memo.net/conoha_ubuntu_vps_first_settings/#toc7

【備忘録】Ubuntu22.04.3以降でSSH接続できない病を何とかする
https://www.uni-sonia.com/archives/1477

【Conoha VPS】TeraTerm等を使わずに、一般ユーザーで公開鍵認証ができるようにする
https://qiita.com/chiacky/items/f8a930fa511a37ff8f2e

他いくつかのサイトを参考に設定を行っています（これもメモをしておくべきでした学び）