Ubuntuサーバを強化する方法

ノード保護のためのセキュリティ強化方法です。

🧙♂ ルート権限を付与したユーザーアカウントの作成

サーバを操作する場合はrootアカウントを使用せず、root権限を付与したユーザーアカウントで操作するようにしましょう。 rootアカウントで誤ってrmコマンドを使用すると、サーバ全体が完全消去されます。

新しいユーザーの追加 (例:cardano)

adduser cardano
New password: # ユーザーのパスワードを設定
Retype new password: # 確認再入力
Enter the new value, or press ENTER for the default
Full Name []: # フルネーム等の情報を設定 (不要であればブランクでも OK)
Room Number []:
Work Phone []:
Home Phone []:
Other []:

cardanoをsudoグループに追加する

usermod -G sudo cardano

****🔏 SSHパスワード認証を無効化し、SSH鍵認証方式のみを使用する

SSHを強化する基本的なルールは次の通りです。

  • SSHログイン時パスワード無効化 (秘密鍵を使用)

  • rootアカウントでのSSHログイン無効化 (root権限が必要なコマンドはsu or sudoコマンドを使う)

  • 許可されていないアカウントからのログイン試行をログに記録する (fail2banなどの、不正アクセスをブロックまたは禁止するソフトウェアの導入を検討する)

  • SSHログイン元のIPアドレス範囲のみに限定する (希望する場合のみ)※利用プロバイダーによっては、定期的にグローバルIPが変更されるので注意が必要

鍵ペアーの作成

ローカルマシンに新しいSSH公開鍵と秘密鍵のペアキーを作成する。ファイル名(キーネーム)を入力するように求められます。

ssh-keygen -t rsa

公開鍵(*.pub)をリモートノードへ転送する。

ssh-copy-id コマンドを使用することで、リモートサーバへ「.ssh/authorized_keys」として転送してくれます。

ssh-copy-id -i $HOME/.ssh/<キーネーム>.pub cardano@server.ip.address

先程作成したユーザーアカウント(cardano)でログインする

ssh cardano@server.ip.address

SSHの設定変更

/etc/ssh/sshd_configファイルを開く

sudo nano /etc/ssh/sshd_config

ChallengeResponseAuthenticationの項目を「no」にする

ChallengeResponseAuthentication no

PasswordAuthenticationの項目を「no」にする

PasswordAuthentication no

PermitRootLoginの項目を「no」にする

PermitRootLogin no

PermitEmptyPasswordsの項目を「no」にする

PermitEmptyPasswords no

ポート番号をランダムな数値へ変更する

ローカルマシンからSSHログインする際、ポート番号を以下で設定した番号に合わせてください。

Port <port number>

SSH構文にエラーがないかチェックします。

sudo sshd -t

SSH構文エラーがない場合、SSHプロセスを再起動します。

sudo service sshd reload

一旦、ログオフし、ログイン出来るか確認します。

exit
ssh cardano@server.ip.address

上記でログイン出来ない場合は、SSHキーを指定してログインします。

ssh -i <path to your SHH_key_name.pub> cardano@server.ip.address

****🤖 システムを更新する

不正アクセスを予防するには、システムに最新のパッチを適用することが重要です。

sudo apt-get update -y && sudo apt-get upgrade -y
sudo apt-get autoremove
sudo apt-get autoclean

自動更新を有効にすると、手動でインストールする手間を省けます。

sudo apt-get install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades

🧸 rootアカウントを無効にする

サーバーのセキュリティを維持するために、頻繁にrootアカウントでログインしないでください。

# rootアカウントを無効にするには、-lオプションを使用します。
sudo passwd -l root
# 何らかの理由でrootアカウントを有効にする必要がある場合は、-uオプションを使用します。
sudo passwd -u root

🛠 SSHの2段階認証を設定する

設定に失敗するとログインできなくなる場合があるので、設定前に2つのウィンドウでログインしておいてください。 万が一ログインできなくなった場合、復旧できます。

SSHはリモートアクセスに使用されますが、重要なデータを含むコンピュータとの接続としても使われるため、別のセキュリティーレイヤーの導入をお勧めします。2段階認証(2FA) 事前にお手元のスマートフォンに「Google認証システムアプリ」のインストールが必要です

sudo apt update
sudo apt upgrade
sudo apt install libpam-google-authenticator -y

SSHがGoogle Authenticator PAM モジュールを使用するために、/etc/pam.d/sshdファイルを編集します。

sudo nano /etc/pam.d/sshd

先頭の @include common-authを#を付与してコメントアウトする

#@include common-auth

以下の行を追加します。

auth required pam_google_authenticator.so

以下を使用してsshdデーモンを再起動します。

sudo systemctl restart sshd.service

/etc/ssh/sshd_config ファイルを開きます。

sudo nano /etc/ssh/sshd_config

ChallengeResponseAuthenticationの項目を「yes」にします。

ChallengeResponseAuthentication yes

UsePAMの項目を「yes」にします。

UsePAM yes

最後の行に1行追加します。(SSH公開鍵秘密鍵ログインを利用の場合)

AuthenticationMethods publickey,keyboard-interactive

ファイルを保存して閉じます。

以下を使用してsshdデーモンを再起動します。

sudo systemctl restart sshd.service

google-authenticator コマンドを実行します。

google-authenticator

いくつか質問事項が表示されます。推奨項目は以下のとおりです。

  • Make tokens “time-base”": yes

  • Update the .google_authenticator file: yes

  • Disallow multiple uses: yes

  • Increase the original generation time limit: no

  • Enable rate-limiting: yes

プロセス中に大きなQRコードが表示されますが、その下には緊急時のスクラッチコードがひょうじされますので、忘れずに書き留めておいて下さい。

スマートフォンでGoogle認証システムアプリを開き、QRコードを読み取り2段階認証を機能させます。

🧩 安全な共有メモリー

システムで共有されるメモリを保護します。

/etc/fstabを開きます

sudo nano /etc/fstab

次の行をファイルの最後に追記して保存します。

tmpfs /run/shm tmpfs ro,noexec,nosuid 0 0

変更を有効にするには、システムを再起動します。

sudo reboot

****⛓ Fail2banのインストール

Fail2banは、ログファイルを監視し、ログイン試行に失敗した特定のパターンを監視する侵入防止システムです。特定のIPアドレスから(指定された時間内に)一定数のログイン失敗が検知された場合、Fail2banはそのIPアドレスからのアクセスをブロックします。

sudo apt-get install fail2ban -y

SSHログインを監視する設定ファイルを開きます。

sudo nano /etc/fail2ban/jail.local

ファイルの最後に次の行を追加し保存します。

[sshd]
enabled = true
port = <22 or your random port number>
filter = sshd
logpath = /var/log/auth.log
maxretry = 3

fail2banを再起動して設定を有効にします。

sudo systemctl restart fail2ban

****🧱 ファイアウォールを構成する

標準のUFWファイアウォールを使用して、ノードへのネットワークアクセスを制限できます。

新規インストール時点では、デフォルトでufwが無効になっているため、以下のコマンドで有効にしてください。

  • SSH接続用のポート22番(または設定したランダムなポート番号 #)

  • ノード用のポート6000番または6001番

  • ノード監視Grafana用3000番ポート (このノードで起動している場合)

  • ブロックプロデューサーノードおよびリレーノード用に設定を変更して下さい。

  • ブロックプロデューサーノードでは、リレーノードのIPのみ受け付ける用に設定してください。

ufw allow <22またはランダムなポート番号>/tcp
#リレーノードのIPを指定する場合
#ufw allow from <リレーノードIP> to any port <ノード用のポート番号>
ufw allow 6000/tcp
ufw allow 3000/tcp
ufw enable
ufw status numbered

設定が有効であることを確認します。

To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 3000/tcp ALLOW IN Anywhere
[ 3] 6000/tcp ALLOW IN Anywhere
[ 4] 22/tcp (v6) ALLOW IN Anywhere (v6)
[ 5] 3000/tcp (v6) ALLOW IN Anywhere (v6)
[ 6] 6000/tcp (v6) ALLOW IN Anywhere (v6)

🔭 リスニングポートの確認

安全なサーバーを維持するには、時々リスニングネットワークポートを検証する必要があります。これにより、ネットワークに関する重要な情報を得られます。

netstat -tulpn
ss -tulpn

🚀 参考文献

https://gist.github.com/lokhman/cc716d2e2d373dd696b2d9264c0287a3#file-ubuntu-hardening-md