「カーネルレベルの作業に深く踏み込む前に、Linuxの基礎に立ち返った。K8sクラスターとeBPFプローブの下で動いているのはこれだ——理解することは必須だ。」
今週の4つの問題:CentOS StreamでのSELinux設定、Cronジョブの自動化、複数サーバーへのパスワードなしSSH、Ansibleのバージョン管理とグローバルインストール。すべてリファレンスとしてここに記録する。
Day 5:CentOS StreamでのSELinux設定
問題
LabがAppArmorの無効化、SELinuxのインストール、設定を要求した。落とし穴:環境はUbuntuではなくCentOS Stream 9だった。これまでのチュートリアル、ブートキャンプ、labはすべてUbuntuを使っていた。筋肉記憶は深く刻まれている。
# 最初の試み
sudo apt update
sudo apt install -y selinux-basics selinux-policy-default auditd
コマンドが見つからない。何かを実行する前は必ずOSを確認しろ。
cat /etc/os-release
NAME="CentOS Stream"
VERSION="9"
ID="centos"
ID_LIKE="rhel fedora"
RHELベース。apt ではなく dnf。パス、パッケージ名、すべてが違う。
解決
sudo dnf install -y selinux-policy selinux-policy-targeted policycoreutils
sudo vi /etc/selinux/config
# SELINUX=enforcing → SELINUX=disabled
確認
getenforce
sestatus
期待される出力:Disabled
なぜ重要か
クラウドとコンテナのコンテキストではUbuntuに当たることが多く、エンタープライズインフラ——銀行、通信、レガシー企業環境——ではRHEL系に当たる。ツールの違いは大きく、一方を前提にするともう一方が壊れる。何かを実行する前に /etc/os-release を確認しろ。常に。
診断リファレンス
# 何かを触る前にディストリビューションを確認
cat /etc/os-release
# SELinuxの状態を確認
getenforce
sestatus
# 現在のポリシーを表示
cat /etc/selinux/config
本番環境の注意: SELinuxを無効にするな。必要なものを許可するようにポリシーを設定しろ。無効化はlabのショートカットであって、本番の答えではない。
Day 6:Cronジョブの自動化
タスク
3台のアプリサーバーで5分ごとに /tmp/cron_text に "hello" をエコーする。
セットアップ
sudo dnf install -y cronie
sudo systemctl enable --now crond
間違った方法
# rootなしで直接書き込みを試みた
echo "*/5 * * * * echo hello > /tmp/cron_text" >> /var/spool/cron/root
# Permission denied
正しい方法
sudo su -
echo "*/5 * * * * echo hello > /tmp/cron_text" >> /var/spool/cron/root
crontab -l
Cron構文リファレンス
*/5 * * * * — 毎分5分、毎時間、毎日、毎月、毎曜日。
| フィールド | 値 | 意味 |
|---|---|---|
| 分 | */5 | 5分ごと |
| 時 | * | 毎時間 |
| 日 | * | 毎日 |
| 月 | * | 毎月 |
| 曜日 | * | 毎曜日 |
覚えておく価値のある一般的なパターン:
# 毎時0分
0 * * * * command
# 毎日深夜0時
0 0 * * * command
# 毎月曜日午前9時
0 9 * * 1 command
# 15分ごと
*/15 * * * * command
デプロイ前にcrontab.guruで式を検証しろ。
本番環境への改善点: このスクリプトは動く。本番バージョンにはタイムスタンプ付き出力、ログローテーション、失敗時のアラートが必要だ——裸の echo リダイレクトではなく。labのパターンを本番に持ち込むな。
Day 7:パスワードなしSSH
タスク
ジャンプホスト(thor)から3台のアプリサーバーへのパスワードなしSSH。自動化が無人で実行される前の前提条件だ。
セットアップ
# ジャンプホストでバックアップユーザーとして鍵ペアを生成
ssh-keygen -t rsa -b 4096
# 各サーバーに公開鍵をコピー
ssh-copy-id tony@stapp01
ssh-copy-id steve@stapp02
ssh-copy-id banner@stapp03
# 確認——パスワードプロンプトなしで返ってくる必要がある
ssh tony@stapp01 hostname
ssh-copy-idが失敗した場合
# 手動フォールバック
cat ~/.ssh/id_rsa.pub | ssh user@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
パーミッション要件
パーミッションが間違っているとSSHはパスワード認証にサイレントにフォールバックする。エラーがないのにパスワードを求められるので最も時間を無駄にする失敗パターンだ。
~/.ssh/ → 700
~/.ssh/authorized_keys → 600
~/.ssh/id_rsa → 600
~/.ssh/id_rsa.pub → 644
テストの前にこれを設定しろ。認証が機能しない場合は何より先にパーミッションを確認しろ。
診断リファレンス
# Verboseなssh出力——認証がどこで失敗するか正確に表示
ssh -vvv user@host
# authorized_keysの内容を確認
cat ~/.ssh/authorized_keys
# パーミッションを一度に確認
stat ~/.ssh ~/.ssh/authorized_keys ~/.ssh/id_rsa
本番環境への改善点: 実際の環境では、authorized_keys への手動コピーの代わりにシークレットマネージャーか認証局を使え。ssh-copy-id はlabには問題ない、フリートには向かない。
Day 8:Ansible——バージョン管理とグローバルインストール
タスク
特定バージョンのAnsibleをインストールし、すべてのサーバーでグローバルに利用可能にする。
事前確認
python3 -m pip -V
pipが利用可能でない場合は先にインストールしろ。あることを前提にするな。
ユーザーインストール vs グローバルインストール
# ユーザーインストール——現在のユーザーのみ利用可能
python3 -m pip install --user "ansible==4.8.0"
# 場所を確認
which ansible
# ~/.local/bin/ansible — グローバルに利用不可
labはグローバルでの利用可能性を要求した。ユーザーインストールではカバーできない。
グローバルインストール
# まずユーザーインストールを削除
python3 -m pip uninstall -y ansible ansible-core
rm -f ~/.local/bin/ansible ~/.local/bin/ansible-playbook
# グローバルにインストール
sudo python3 -m pip install "ansible==4.8.0"
# 確認
which ansible
# /usr/local/bin/ansible
ansible --version
アンインストール時は ansible と ansible-core の両方を削除しろ。ansible は ansible-core に依存していて、片方だけ削除するとpipが不整合な状態になる。
| タイプ | コマンド | 場所 | スコープ |
|---|---|---|---|
| ユーザー | pip install --user |
~/.local/bin |
現在のユーザーのみ |
| グローバル | sudo pip install |
/usr/local/bin |
全ユーザー |
バージョン固定
バージョン指定子は常にクォートしろ:
# 正しい
sudo python3 -m pip install "ansible==4.8.0"
# シェル展開でこれが壊れる可能性がある
sudo python3 -m pip install ansible==4.8.0
# インストールされたバージョンを確認
ansible --version
python3 -m pip list | grep ansible
本番環境への改善点: グローバルpipインストールの代わりにプロジェクトごとに専用のvirtualenvを使え。グローバルインストールは同じホスト上のツール間で依存関係の競合を生む。
全体的な診断リファレンス
# OS識別
cat /etc/os-release
# SELinux
getenforce
sestatus
cat /etc/selinux/config
# Cron
crontab -l
systemctl status crond
grep CRON /var/log/syslog
# SSH認証デバッグ
ssh -vvv user@host
stat ~/.ssh ~/.ssh/authorized_keys
ls -la ~/.ssh/
# Ansible
ansible --version
python3 -m pip list | grep ansible
which ansible
より詳細なケーススタディはこちらで公開しています。
Elijah Udom (@elijahu_) — ラゴス拠点のインフラ・クラウドエンジニア。AWS、Kubernetes、eBPFセキュリティ、AI/MLインフラ。