VirtualBoxインストールとLinuxサーバー初期設定まで
Linuxサーバー構築の練習として、表題の通り、VirtualBoxのインストールとLinuxサーバーの初期設定までを行いました。
公式サイトからVirtualBoxをダウンロード、インストール後初期設定としてメモリとストレージの要領、言語、キー配列などの設定を行い、VM上にOSをインストールしました。
インストールしたディストリビューションはRocky Linuxです。
Rocky Linuxはサーバー用途のRHEL系ディストリということで、今回の用途にもぴったりだと思いました。
ルートユーザーは作成しないで初期設定を終えたので、ルート権限が必要なコマンドについてはsudoで代用する形となります。
VMを起動して、ターミナルで以下のコマンドを実行しました。
whoami
sudo dnf update -y
これらのコマンドは、上からログインユーザーの確認、システムの更新を意味します。
-yのオプションは、途中の確認に対して全てyesと回答するオプションです。
なお、説明のためにキャプションなどを用意したほうが良かったのですが、失念していたためすべて文章で説明します。
次に、以下のコマンドを実行しました。
これらは、sshおよびWebサーバーのインストールと有効化、そしてインストールしたssh-serverとhttpdの状態の確認を意味します。
enableはOSの起動時に自動実行されるように設定するためのコマンドです。
statusコマンドで active(running) となっていることを確認しました。
sudo dnf install openssh-server -y
sudo systemctl enable sshd
sudo systemctl start sshd
systemctl status sshd
sudo dnf install httpd -y
sudo systemctl enable httpd
sudo systemctl start httpd
systemctl status httpd
次に、以下のコマンドでVMのipアドレスを確認しました。
ip a
curl http://localhost を実行するか、Webブラウザのアドレスバーにhttp://(確認したip)を入力することで、Webサーバーにアクセス可能であることを確認しました。
次に、ホストPCからWebサーバーにアクセスできるようにVirtualBoxのポートフォワーディングを以下のとおりに設定しました。
名前:http
ホストポート:8080
ゲストポート:80
さらに、VMのファイアウォール設定を行うために、以下のコマンドを実行しました。
これらはfirewalldの設定を確認→サービスにhttpを追加→firewalldを更新することを意味します。
sudo systemctl status firewalld
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --reload
ここまで来たら、ホストPCのWebブラウザからlocalhost:8080にアクセスしてWebサーバーへのアクセスができることを確認しました。
(このとき、設定のミスやタイポのためにファイアウォールの開放がうまく行かずアクセスできない事態が発生しました。)
次に、以下のコマンドを実行して、ファイアウォールを閉じるとアクセスできなくなることを確認しました。
その後先述のコマンドを実行して、再びファイアウォールを開放状態としました。
sudo firewall-cmd --remove-service=http --permanent
sudo firewall-cmd --reload
以下のコマンドでファイアウォールが通信を許可しているサービスの一覧を確認することが出来ます。このコマンドの実行結果の、service:の項目にhttpが表示されていることを確認しました。
sudo firewall-cmd --list-all
次にジャーナルの設定を行いました。
以下のコマンドを実行することでジャーナルログを永続化することが出来ます。
これにより、VMを再起動しても前回起動時のログを確認することができるようになります。
sudo mkdir -p /var/log/journal
sudo systemctl restart systemd-journald
次にsshの設定をして、ホストPCからssh接続にてVMにアクセスできるように設定しました。
まず、次のコマンドでssh接続ができないことを確認しました。
ssh (VMのユーザーネーム)@localhost -p 2222
次に、以下のコマンドでsshdが有効化されていること、sshdが22番ポートを待ち受けしていること、ファイアウォールが通信を許可しているかを確認しました。
sudo systemctl status sshd -> running
ss -tlnp | grep 22 -> LISTEN(IPv4/v6):22
sudo firewall-cmd --list-all -> service:ssh
備忘録メモ:
ss -tlnp | grep 22
このコマンドは「22番ポートで接続を待ち受けているプロセスがあるかを確認する」コマンド。
ss: ソケット情報を表示する
-t: TCPソケットのみを表示
-l: 待受状態のソケットを表示
-n: ポート番号を数字のまま表示
-p: そのソケットを使用しているプロセス名とIDを表示
この実行結果をパイプでgrepの引数に流し込むことで、実行結果の中から22を含むものを表示し、結果的に22番ポートで接続を待ち受けているプロセスがあるかどうかを確認することができる。
ここで、VirtualBoxのポートフォワーディングで
名前:ssh
プロトコル:TCP
ホスト:2222
ゲスト:22
を設定することで、sshコマンドでアクセスが可能になることを確認しました。
VM内の設定に固執してVirtualBoxの設定を見落としていました。
改めてホスト側からsshコマンドを実行すると、パスワード認証によってVMにアクセスすることが出来ました。
次に、この認証方式をパスワードから公開鍵方式に変更しました。
まず、ホスト側でssh-keygenを実行し、
ssh-copy-id -p 2222 (VMのユーザーネーム)@localhost
ssh (VMのユーザーネーム)@localhost -p 2222
を実行することで、パスワードなしでログインすることができるようになりました。
次に、VM側でパスワード認証を制限しました。
以下のコマンドを実行しました。
sudo vi /etc/ssh/sshd_config
viエディタを操作して、
# PasswordAuthentication no
のコメントアウト(#)を削除することでパスワード認証を無効化しました。
その後
sudo systemctl restart sshd
を実行して変更を反映しました。
備忘録メモ:
sshd_config内にPasswordAuthentication が出てくる箇所が2箇所あり、片方は説明書きのようなものなのでそちらを編集しても意味がないことに注意。
行頭のハッシュはコメントアウトなのでそれを消すことも忘れないこと。
以下のコマンドを実行し、結果を確認することで、設定の反映が正常に行われていることを確認しました。
sudo grep -i passwordauthentication /etc/ssh/sshd_config
-> Passwordauthentication no
sudo sshd -T | grep passwordauthentication
-> passwordauthentication no
備忘録メモ:
grep -i: 検索時に大文字と小文字を区別しない
sshd -T: すべての設定値を書き出す
-p: 接続先のポート番号を指定
-o: 設定値を書き換えずに、一時的に設定項目を指定する
最後に、ホスト側で以下のコマンドを実行し、パスワード認証が無効化されていることを確認しました。
ssh (VMのユーザーネーム)@localhost -p 2222
->パス無しでアクセス可能
ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no (VMのユーザーネーム)@localhost -p 2222
-> Permission denied
以上が現在行なった設定です。
今回実際に構築してみて、
「通信が通る」ということが複数のレイヤの設定で成り立っていることを実感しました。
特に、
・VirtualBox
・firewalld
・sshd
がそれぞれ別の責務を持っていることが印象的でした。
引き続きAIと相談しながら、更に構築の練習をしていきます。