description |
---|
ノード保護のためのセキュリティ強化方法です。 |
{% hint style="danger" %}
🛑 このマニュアルは2022年3月1日に新ドメインにてリニューアルします
新マニュアルサイトはこちらSPO JAPAN GUILD DOCS
{% endhint %}
{% hint style="info" %}
AWS EC2及びlightsailは特殊環境なため、このマニュアル通りに動かない場合がございます。
不明な点はGuildコミュニティで質問してみてください。
{% endhint %}
{% hint style="info" %} この手順はエアギャップオフラインマシン(VirtualBox上のUbuntu)では実施する必要はありません {% endhint %}
1.R-Login(Winodws)http://nanno.dip.jp/softlib/man/rlogin/ 2.Terminal(Mac)https://www.webdesignleaves.com/pr/plugins/mac_terminal_basics_01.html
{% hint style="info" %} サーバを操作する場合はrootアカウントを使用せず、root権限を付与したユーザーアカウントで操作するようにしましょう。 rootアカウントで誤ってrmコマンドを使用すると、サーバ全体が完全消去されます。 {% endhint %}
新しいユーザーの追加 (例:cardano)
1.上記ターミナルソフトを使用し、サーバーに割り当てられた初期アカウント(rootなど)でログインする。
2.新しいユーザーアカウントを作る(任意のアルファベット文字)
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 []:
Is the information correct? [Y/n]:y
cardanoをsudoグループに追加する
usermod -G sudo cardano
rootユーザーからログアウトする
exit
3.ターミナルソフトのユーザーをパスワードを上記で作成したユーザーとパスワードに書き換えて再接続。
{% hint style="info" %} SSHを強化する基本的なルールは次の通りです。
- SSHログイン時パスワード無効化 (秘密鍵を使用)
- rootアカウントでのSSHログイン無効化 (root権限が必要なコマンドは
su
orsudo
コマンドを使う) - 許可されていないアカウントからのログイン試行をログに記録する (fail2banなどの、不正アクセスをブロックまたは禁止するソフトウェアの導入を検討する)
- SSHログイン元のIPアドレス範囲のみに限定する (希望する場合のみ)※利用プロバイダーによっては、定期的にグローバルIPが変更されるので注意が必要 {% endhint %}
ssh-keygen -t rsa
次のような返り値があります。
それぞれ何も入力せずにEnterを押してください
Enter file in which to save the key (/home/cardano/.ssh/id_rsa): #このままEnter
lsEnter passphrase (empty for no passphrase): #このままEnter
Enter same passphrase again: #このままEnter
パスワードは設定しなくてもOK
cd ~/.ssh
ls
id_rsa(秘密鍵)とid_rsa.pub(公開鍵)というファイルが作成されているか確認する。
cd ~/.ssh/
cat id_rsa.pub >> authorized_keys
chmod 600 authorized_keys
chmod 700 ~/.ssh
rm id_rsa.pub
1.R-loginの場合はファイル転送ウィンドウを開く
2.左側ウィンドウ(ローカル側)は任意の階層にフォルダを作成する。
3.右側ウィンドウ(サーバ側)は「.ssh」フォルダを選択する
4.右側ウィンドウから、id_rsaファイルの上で右クリックして「ファイルのダウンロード」を選択する
5.一旦サーバからログアウトする
6.R-Loginのサーバ接続編集画面を開き、「SSH認証鍵」をクリックし4でダウンロードしたファイルを選ぶ
7.サーバへ接続する
/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
ポート番号をランダムな数値へ変更する (49513~65535までの番号)
Port xxxxx 先頭の#を外してランダムな数値へ変更してください
{% hint style="info" %} ローカルマシンからSSHログインする際、ポート番号を以下で設定した番号に合わせてください。 {% endhint %}
Ctrl+O で保存し、Ctrl+Xで閉じる
SSH構文にエラーがないかチェックします。
sudo sshd -t
SSH構文エラーがない場合、SSHプロセスを再起動します。
sudo service sshd reload
一旦、ログオフし、ログイン出来るか確認します。
exit
{% hint style="info" %} 上記でログイン出来ない場合は、SSHキーを指定してログインします。
{% hint style="warning" %} 不正アクセスを予防するには、システムに最新のパッチを適用することが重要です。 {% endhint %}
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アカウントを無効にするには、-lオプションを使用します。
sudo passwd -l root
# 何らかの理由でrootアカウントを有効にする必要がある場合は、-uオプションを使用します。
sudo passwd -u root
{% hint style="info" %} システムで共有されるメモリを保護します。 {% endhint %}
/etc/fstab
を開きます
sudo nano /etc/fstab
次の行をファイルの最後に追記して保存します。
tmpfs /run/shm tmpfs ro,noexec,nosuid 0 0
{% hint style="info" %}
サーバーメモリが16GBの場合、Swap設定を行ってください。
ただし契約サーバーによっては追加できない場合があります。
{% endhint %}
cd $HOME
sudo fallocate -l 8G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo swapon --show
sudo cp /etc/fstab /etc/fstab.bak
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
echo 'vm.vfs_cache_pressure=50' | sudo tee -a /etc/sysctl.conf
cat /proc/sys/vm/vfs_cache_pressure
cat /proc/sys/vm/swappiness
変更を有効にするには、システムを再起動します。
sudo reboot
{% hint style="info" %} Fail2banは、ログファイルを監視し、ログイン試行に失敗した特定のパターンを監視する侵入防止システムです。特定のIPアドレスから(指定された時間内に)一定数のログイン失敗が検知された場合、Fail2banはそのIPアドレスからのアクセスをブロックします。 {% endhint %}
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番ポート
- Prometheus-node-exporter用のポート12798・9100をリレーノードのIPのみ受け付ける用に設定してください。
- ブロックプロデューサーノードおよびリレーノード用に設定を変更して下さい。
- ブロックプロデューサーノードでは、リレーノードのIPのみ受け付ける用に設定してください。
{% tabs %} {% tab title="ブロックプロデューサーノード" %}
sudo ufw allow <22またはランダムなポート番号>/tcp
sudo ufw allow from <リレーノードIP> to any port <BP用のポート番号(6000)>
sudo ufw allow from <リレーノードIP> to any port 12798
sudo ufw allow from <リレーノードIP> to any port 9100
sudo ufw enable
sudo ufw status numbered
{% endtab %}
{% tab title="リレーノード1" %}
sudo ufw allow <22またはランダムなポート番号>/tcp
sudo ufw allow 6000/tcp
sudo ufw allow 3000/tcp
sudo ufw enable
sudo ufw status numbered
{% endtab %} {% endtabs %}
設定が有効であることを確認します。
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
{% hint style="warning" %}
設定に失敗するとログインできなくなる場合があるので、設定前に2つのウィンドウでログインしておいてください。
万が一ログインできなくなった場合、復旧できます。
{% endhint %}
{% hint style="info" %}
SSHはリモートアクセスに使用されますが、重要なデータを含むコンピュータとの接続としても使われるため、別のセキュリティーレイヤーの導入をお勧めします。2段階認証(2FA)
事前にお手元のスマートフォンに「Google認証システムアプリ」のインストールが必要です
{% endhint %}
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段階認証を機能させます。
{% embed url="https://medium.com/@BaneBiddix/how-to-harden-your-ubuntu-18-04-server-ffc4b6658fe7" %}
{% embed url="https://linux-audit.com/ubuntu-server-hardening-guide-quick-and-secure/" %}
{% embed url="https://www.digitalocean.com/community/tutorials/how-to-harden-openssh-on-ubuntu-18-04" %}
{% embed url="https://ubuntu.com/tutorials/configure-ssh-2fa\#1-overview" %}
https://gist.github.com/lokhman/cc716d2e2d373dd696b2d9264c0287a3#file-ubuntu-hardening-md
{% embed url="https://www.lifewire.com/harden-ubuntu-server-security-4178243" %}
{% embed url="https://www.ubuntupit.com/best-linux-hardening-security-tips-a-comprehensive-checklist/" %}