SPO JAPAN GUILD
ステークプール構築

Ubuntu初期設定

ヒント

この手順は、エアギャップのUbuntuでは実施する必要はございません。

AWSをご利用の方

AWS EC2 / Lightsail では SSH 鍵認証やユーザー構成が異なるため、本マニュアル通りに動作しない場合があります。

1. サーバーログイン(初回のみ / root)

重要

この手順は 初回ログイン時のみ 使用します。
以降の設定で、rootログインおよびパスワード認証は無効化します。

項目設定値
ホストサーバーIP
ポートSSH(22)
ユーザーroot
パスワード契約時に送付される初期 root パスワード

2. ユーザーアカウント作成

ヒント

日常運用ではrootアカウントを使用せず、sudo権限を付与した一般ユーザーで操作します。

新しいユーザーを作成します。

任意のアルファベット文字を入力してください。
この例ではcardano ユーザーとして以降進めます。

adduser cardano
期待される表示例:
New password:           # パスワードを設定
Retype new password:    # 確認のため再入力

Enter the new value, or press ENTER for the default
        Full Name []:   # フルネーム等の情報を設定(不要であればブランクでも問題ありません)
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n] : y

cardanoにsudo権限を付与します。

usermod -aG sudo cardano

rootからログアウトします。

exit

ヒント

ターミナルソフトの接続ユーザーを、上記で作成したユーザー名(cardano)およびパスワードに変更して再接続してください。

ブラケットペースト機能を無効化します。

grep -qxF 'set enable-bracketed-paste off' ~/.inputrc 2>/dev/null || echo 'set enable-bracketed-paste off' >> ~/.inputrc

設定反映のため、ターミナルから一度ログアウトして再ログインしてください。

デーモン再起動を自動化します。

echo "\$nrconf{restart} = 'a';" | sudo tee /etc/needrestart/conf.d/50local.conf
echo "\$nrconf{blacklist_rc} = [qr(^cardano-node\\.service$) => 0, qr(^cnode-blocknotify\\.service$) => 0, qr(^cnode-cncli-sync\\.service$) => 0,];" | sudo tee -a /etc/needrestart/conf.d/50local.conf

3. SSH設定変更

SSH強化設定ルール

  • SSHログイン時パスワード無効化(秘密鍵を使用)
  • SSHデフォルトポート(22)の変更
  • rootアカウントでのSSHログイン無効化(root権限が必要な操作は sudo を使用します。)
  • 許可されていないアカウントからのログイン試行をログに記録(fail2ban 等で対策)
  • SSHログイン元のIPアドレス範囲のみに限定(希望する場合のみ)※利用プロバイダーによっては、定期的にグローバルIPが変更されるので注意が必要

SSHポートのヒント

SSHポートは世界標準で22番が割り当てられています。
しかし、ポートスキャンやブルートフォース攻撃の標的となりやすいため、本マニュアルでは任意のポート番号への変更を推奨します。
ポート番号は、IANAが定義する動的/プライベートポート範囲である49513~65535の中から指定してください。

SSHディレクトリを作成します。

mkdir -p ~/.ssh

ファイル転送

SSH鍵作成で生成したauthorized_keysを対象サーバーの$HOME/.sshディレクトリにコピーします。

authorized_keys ローカルのホストマシン 対象サーバー

パーミッションを設定します。

chown -R "$USER:$USER" ~/.ssh
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

49513~65535の範囲内でSSHポート番号を""内に指定してください。

PORT_NUM=""
sudo tee /etc/ssh/sshd_config.d/01-custom-ssh.conf > /dev/null << EOF
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin no
PermitEmptyPasswords no
Port ${PORT_NUM}
EOF

構文をチェックします。

sudo sshd -t

有効設定を確認します。

sudo sshd -T | grep -iE 'passwordauthentication|kbdinteractiveauthentication|permitrootlogin|port'
期待される表示例:
port xxxxx
permitrootlogin no
passwordauthentication no
kbdinteractiveauthentication no
gatewayports no

ssh.socketの設定

sudo systemctl status ssh.socket
期待される表示例:
● ssh.socket - OpenBSD Secure Shell server socket
~~~
     Active: active (running) 

問題がなければ、SSHサービスを再起動します。

sudo systemctl daemon-reload
sudo systemctl restart ssh.socket

確認

sudo ss -tlnp | grep ssh
期待される表示例:
LISTEN 0 4096 0.0.0.0:<設定したSSH Port>  
LISTEN 0 4096 [::]:<設定したSSH Port>  

ターミナルソフト設定について

  • 現在起動中のターミナルは接続したままにしてもう一つ起動してください。
  • 接続設定のSSHポート番号を変更し秘密鍵を設定しサーバーへログインできるか確認して下さい。
  • 接続できない場合は、接続されてるターミナル画面でサーバー設定を確認して下さい。

4. ファイアウォール有効化

標準のファイアウォール(UFW)を使用して、インバウンドのアクセス可能なポートを限定します。

注意事項

  • 設定前の注意事項

ご利用のVPSによっては管理画面からファイアウォールを設定する必要があります。(例:AWS系など)
その場合は以下の設定を行わず、VPSマイページ管理画面などから個別に設定してください。

  • さくらVPSをご利用の場合

管理画面からパケットフィルターを、利用しないに設定してください。

SSHポートを許可します。

SSH_PORT=$(sudo sshd -T | awk '$1=="port"{print $2}')
echo "有効なSSHポート: ${SSH_PORT}"
sudo ufw allow ${SSH_PORT}/tcp

ファイアウォールを有効化します。

sudo ufw --force enable

ステータスを確認します。

sudo ufw status
期待される表示例:
Status: active

5. システム更新

重要

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

パッケージリストを更新し、依存関係を含めた包括的なアップグレードを実行します。

sudo apt update && sudo apt full-upgrade -y

不要なパッケージを削除します。

sudo apt autoremove -y

パッケージキャッシュを整理します。

sudo apt autoclean -y

セキュリティ更新の自動適用を有効にします。

sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure --priority=low unattended-upgrades

YESを選択し、Enterを押下

6. rootアカウントの無効化設定

rootアカウントを無効化します。

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

rootアカウント無効

sudo passwd -l root

7. 共有メモリのセキュリティ強化

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

以下の設定を/etc/fstabの最終行に追記します。

echo 'tmpfs /run/shm tmpfs ro,noexec,nosuid 0 0' | sudo tee -a /etc/fstab

追記の確認をします。

tail -n 1 /etc/fstab
期待される表示例:
tmpfs /dev/shm tmpfs ro,noexec,nosuid 0 0

8. Fail2banのインストール

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

インストールを行います。

sudo apt install nano fail2ban -y

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

sudo nano /etc/fail2ban/jail.local

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

コマンド中の (SSHポートを入力してください) については3. SSH設定変更で設定したSSHポートを入力してください。
(**)は不要です。

[sshd]
enabled = true
port = (SSHポートを入力してください)
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 24h
findtime = 10m
backend = systemd

自動起動を有効化し、即時起動します。

sudo systemctl enable --now fail2ban

有効化されているかを確認します。

sudo systemctl status fail2ban --no-pager
期待される表示例:
● fail2ban.service - Fail2Ban Service
~~~
     Active: active (running)

9. Chronyの設定

chronyをインストールします。

sudo apt install chrony -y

バックアップします。

sudo mv /etc/chrony/chrony.conf /etc/chrony/chrony-bk.conf

/etc/chrony/chrony.confを更新します。

cat > $HOME/chrony.conf << EOF
pool time.google.com       iburst minpoll 2 maxpoll 2 maxsources 3 maxdelay 0.3
pool time.facebook.com     iburst minpoll 2 maxpoll 2 maxsources 3 maxdelay 0.3
pool time.euro.apple.com   iburst minpoll 2 maxpoll 2 maxsources 3 maxdelay 0.3
pool time.apple.com        iburst minpoll 2 maxpoll 2 maxsources 3 maxdelay 0.3
pool ntp.ubuntu.com        iburst minpoll 2 maxpoll 2 maxsources 3 maxdelay 0.3

# This directive specify the location of the file containing ID/key pairs for
# NTP authentication.
keyfile /etc/chrony/chrony.keys

# This directive specify the file into which chronyd will store the rate
# information.
driftfile /var/lib/chrony/chrony.drift

# Uncomment the following line to turn logging on.
#log tracking measurements statistics

# Log files location.
logdir /var/log/chrony

# Stop bad estimates upsetting machine clock.
maxupdateskew 5.0

# This directive enables kernel synchronisation (every 11 minutes) of the
# real-time clock. Note that it can’t be used along with the 'rtcfile' directive.
rtcsync

# Step the system clock instead of slewing it if the adjustment is larger than
# one second, but only in the first three clock updates.
makestep 0.1 -1

# Get TAI-UTC offset and leap seconds from the system tz database
leapsectz right/UTC

# Serve time even if not synchronized to a time source.
local stratum 10
EOF

作成したchrony.conf/etc/chrony/chrony.confに移動します。

sudo mv $HOME/chrony.conf /etc/chrony/chrony.conf

UFWで以下を設定します。

sudo ufw allow 123/udp

設定を有効にするには、Chronyを再起動します。

sudo systemctl reload-or-restart chrony.service

ヘルプコマンド

同期データのソース確認

chronyc sources

現在のステータス表示

chronyc tracking

10. sysctlの設定

バックアップを取得しておきます。

sysctl \
  net.ipv4.conf.all.rp_filter \
  net.ipv4.conf.default.rp_filter \
  net.ipv4.icmp_echo_ignore_broadcasts \
  net.ipv4.conf.all.accept_source_route \
  net.ipv4.conf.default.accept_source_route \
  net.ipv4.conf.all.accept_redirects \
  net.ipv4.conf.default.accept_redirects \
  net.ipv4.conf.all.secure_redirects \
  net.ipv4.conf.default.secure_redirects \
  net.ipv4.conf.all.log_martians \
  net.ipv4.tcp_syncookies \
  net.core.somaxconn \
  net.ipv4.tcp_max_syn_backlog \
  net.core.netdev_max_backlog \
  net.ipv4.ip_local_port_range \
  > "$HOME/sysctl-before-cardano-relay-$(date +%F).txt"
sudo tee /etc/sysctl.d/99-cardano-relay.conf > /dev/null << 'EOF'

# ------------------------------
# Security hardening
# ------------------------------

# Ignore ICMP broadcast
net.ipv4.icmp_echo_ignore_broadcasts = 1

# Disable source routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

# Disable ICMP redirects
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0

# Log suspicious packets
net.ipv4.conf.all.log_martians = 1

# SYN flood protection
net.ipv4.tcp_syncookies = 1

# ------------------------------
# Relay network performance
# ------------------------------

# Increase TCP listen queue
net.core.somaxconn = 4096

# Increase SYN backlog
net.ipv4.tcp_max_syn_backlog = 4096

# Improve network buffer
net.core.netdev_max_backlog = 5000

# Increase ephemeral port range
net.ipv4.ip_local_port_range = 10000 65535

EOF

バックアップを取得しておきます。

sysctl \
  net.ipv4.conf.all.rp_filter \
  net.ipv4.conf.default.rp_filter \
  net.ipv4.icmp_echo_ignore_broadcasts \
  net.ipv4.conf.all.accept_source_route \
  net.ipv4.conf.default.accept_source_route \
  net.ipv4.conf.all.accept_redirects \
  net.ipv4.conf.default.accept_redirects \
  net.ipv4.conf.all.secure_redirects \
  net.ipv4.conf.default.secure_redirects \
  net.ipv4.conf.all.log_martians \
  net.ipv4.tcp_syncookies \
  > "$HOME/sysctl-before-cardano-bp-$(date +%F).txt"
sudo tee /etc/sysctl.d/99-cardano-bp.conf > /dev/null << 'EOF'

# ------------------------------
# Security hardening
# ------------------------------

# Ignore ICMP broadcast
net.ipv4.icmp_echo_ignore_broadcasts = 1

# Disable source routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

# Disable ICMP redirects
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0

# Log suspicious packets
net.ipv4.conf.all.log_martians = 1

# SYN flood protection
net.ipv4.tcp_syncookies = 1

EOF

設定反映

sudo sysctl --system

既存設定の確認

cat $HOME/sysctl-before-cardano-*.txt

補足:SSH2段階認証(任意作業・上級者向け)

注意

本設定は必須ではありません。
本手順を実施したサーバーでは、SSHログインに2FAを要求します(= Google Authenticator 未設定ユーザーはログインできません)。
本番サーバー(VPS 等)で適用する場合は、必ず復旧手段(クラウドコンソール等)と予備セッションを確保してから実施してください。


Last updated on

Cookieの使用について

当サイトでは、ドキュメントの効果測定と利用状況の把握のため、Google Analytics を使用しています。

同意すると、分析用 Cookie が有効になります。