【日記】Ubuntu Severで自宅サーバを作る(2)

# フローチャート
1.VMware,Ubuntu Serverをダウンロード
2.VMwareでUbuntu Serverをインストール
　2.1. IPv4固定長の設定
3.Apacheをインストール
4.Apacheで自作Webサイトを表示
　4.1. 自作htmlをUbuntuに転送する
　　4.1.1. UbuntuにOpenSSHをインストールする
　　4.1.2. OpenSSHの各種設定をする
　　　4.1.2.1 ファイアウォールの設定
　　　　4.1.2.1.1. ファイアウォールのインストール
　　　　4.1.2.1.2. ポート番号の変更
　　　4.1.2.2 rootユーザのSSHログインの無効化　　　←次ココ
　　　4.1.2.3 公開鍵認証方式の導入
　　4.1.3. ホストからゲストへ自作htmlを転送する
　4.2. パスを接続する
　4.3. htmlが正常に動作するか確認する
　4.4. 同様にCSS,Javascriptを動かす方法を調べ転送する


###### rootユーザのSSHログイン無効化
 　前回の続きからということでrootユーザのSSHログインの無効化を行う。最高権限を持つユーザをホストのみからのログインの限定することでセキュリティの向上を図る。/etc/ssh/sshd_configを開き、該当箇所を編集する。
 ```
 sudo nano /etc/ssh/sshd_config
 PermitRootLogin no
 sudo systemctl restart ssh
 ```
 別デバイスからも特定の操作ができるように後々ユーザやグループを追加する必要がありそうだ。

 ###### 公開鍵認証方式の導入
 　クライアント(macOS)からサーバ(Ubuntu Server)にSSH接続して操作を行うので、先ほどrootユーザのSSHログインを不可にしてしまったがために新しくユーザを作る必要がある。
```
sudo adduser username
```
登録者情報は一旦全て空欄で続ける。ユーザが新しくできたのでクライアント側から操作する。macのターミナルを開く。
```
ssh username@server_ip
ssh-keygen -t rsa -b 4096
```
-t rsa は鍵の暗号方式、-b 4096は鍵のビット長を定めるオプションである。
ここで誤ってmacOSでSSH接続した後に鍵を作成してしまったため、一度鍵を消してやり直す。
```
rm ~/.ssh/id_rsa ~/.ssh/id_rsa.pub
```
1. ターミナルで鍵を作成し、鍵を初めから終わりまでコピーする
```
ssh-keygen -t rsa -b 4096
cat ~/.ssh/id_rsa.pub
```
２. SSH接続して公開鍵を配置する
```
ssh username@server_ip
mkdir -p ~/.ssh
echo ssh-rsa "your_public_key" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
```
３. Ubuntu Server側でSSH設定をする
```
sudo nano /etc/ssh/sshd_config
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
sudo systemctl restart shh
```
４. クライアント(macOS)からSSH接続して確認する。
パスワード入力を求められなかったので成功していることが判明した。また、新規ユーザでSSH接続したのちsudoコマンドが実行できないことを確認し、管理者権限が正しく設定されていることを確認した。
![スクリーンショット 2024-09-17 16.12.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775837/b3e87d58-7e1b-851a-80f4-dfb5b20aae9f.png)

###### htmlを転送する
　自作したWebページはHTML,CSS,JavaScript,imgをまとめてあるのでフォルダごと転送しapacheのディレクトリに配置する。はじめに、ホストのターミナルを開き`scp`コマンドを用いてゲストへフォルダをコピーする。
 ```
scp -r /Users/foldername/Downloads/foldername ubuntu@192.168.10.2:/var/www/html
```
サーバ側で`var/www/html`を確認するもフォルダが見つからないため検索する。
```
sudo find / -type d -name foldername 2>/dev/null
```
/ はルートディレクトリから順に検索する,
-type d は対象がディレクトリである,
2>/dev/null はエラー出力だけをゴミ箱に入れる=非表示にする
という意味である。出力がなかったので正しくコピーできていないということになる。今度は/var/www/htmlとは異なるディレクトリにコピーしてから移動させてみる。先ほどの`scp`コマンドのコピー先パスを変更して実行すると、フォルダーをコピーするログが流れた。次に、サーバ側で`mv`コマンドを用いフォルダーを移動させる。
![スクリーンショット 2024-09-20 11.25.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775837/6d03a568-796e-3556-a9de-2bdd4b9f4ec8.png)
※一部塗りつぶしてある。
続いて元々あったサンプルhtmlファイルを削除する。
```
rm /var/www/html/index.html
```
このままだと、ブラウザで192.168.10.2/foldernameまで指定しないとwebページが開けないのでhtmlやcssをhtmlディレクトリ直下に移動する。
``` 
sudo mv /var/www/html/foldername/* /var/www/html
rm /var/www/html/foldername
```
ファイル構造が正しいことを確認し、ブラウザで出力を試みるも表示されなかった。そこで`cat`コマンドでhtmlを開いたところ、文字化けしていることがわかった。つまり、apacheのデフォルトの文字コードがUTF-8でない可能性がある。
```
sudo nano /etc/apache2/conf-available/charset.conf
```
しかし、文字コードはUTF-8になっていた。ここで、ファイルのアクセス制御を確認してないことに気がつき、`ls -l`で確認したところ`700`であった。htmlを表示できない原因の一つが判明した。直ちに変更を行う。
```
sudo chmod -R 644 /var/www/html
sudo chmod 755 /var/www/html
```
-R は再帰的に実行することを表し、指定したディレクトリ以下の全てを変更する。再びブラウザで開いても表示されなかった。`cat`コマンドで表示するとスクロールができないため、`less`コマンドで表示し、htmlのheadを確認したところ、文字化けはなかった。mainで文字化けしているところを調べると、全て日本語の部分が文字化けしていた。つまり、とりあえずhtmlが表示できない問題には文字コードは無関係であることが判明した。次の可能性としてUFWによりアクセスが制限されていることが考えられる。apacheは、HTTPは80番,HTTPSは443番が一般的であり、今回はHTTPなので80番を開放する。
```
sudo ufw allow 80
```
![スクリーンショット 2024-09-20 15.02.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775837/aa032284-eee2-a478-ca80-512ba91e3b1b.png)
出力に成功した。しかし、画像の表示に失敗している。ファイル構造は変わっていないはずである。imageディレクトリのパーミッションを確認すると、htmlやcssなどと同様に実行権限が付与されていなかった。つまり、ディレクトリを開けないのが原因である。権限を変更する。
```
sudo chmod 755 /var/www/html/images
```
リロードすると画像も出力することができた。著作権の都合でスクショは控える。

# 総評
#### 全体のフローチャート
1.VMware,Ubuntu Serverをダウンロード
2.VMwareでUbuntu Serverをインストール
　2.1. IPv4固定長の設定
3.Apacheをインストール
4.Apacheで自作Webサイトを表示
　4.1. ホストの自作htmlをゲストにコピーする
　　4.1.1. UbuntuにOpenSSHをインストールする
　　4.1.2. OpenSSHの各種設定をする
　　　4.1.2.1 ファイアウォールの設定
　　　　4.1.2.1.1. ファイアウォールのインストール
　　　　4.1.2.1.2. ポート番号の変更
　　　4.1.2.2. rootユーザのSSHログインの無効化
　　　4.1.2.3. 公開鍵認証方式の導入
　　4.1.3. htmlディレクトリの配置
  　　4.1.3.1. パーミッション,ufwの設定

#### 特に手間取った作業
* IPv4固定長の設定
自宅ルータのDHCP自動割り当ての設定をし直すのに苦労した。
* ポート番号の変更 22/TCP → 2222/TCP
変更する作業自体は容易だったが、変更後にSSH接続をできなくなるエラーが発生した。自力での原因究明ができなかったので、とりあえず22/TCPを利用した。この原因は後日有識者に尋ねて修正したい。
* SSH接続
公開鍵認証の知識を実際に使い、2つのOS間で公開鍵認証方式を確立した。
* HTMLのコピー
指定したディレクトリにコピーする際、エラーが発生した。これも原因不明で迂回策をとったため、次のブログで調査する。また、htmlなどに相対パスを用いているため、ファイル構造を意識した学習ができた。
* HTMLの表示
HTMLが表示されない理由を探るのに時間がかかった。ディレクトリ,ファイルのアクセス制御,UFWのポート制限が原因であった。原因を探る過程で文字コードやapacheの設定などを見直し、さらに知識の獲得ができた。