0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

KodeKloud 100日間チャレンジ Days 5-8:SELinux、Cron、AnsibleとSSH鍵管理

0
Posted at

「カーネルレベルの作業に深く踏み込む前に、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

アンインストール時は ansibleansible-core の両方を削除しろ。ansibleansible-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インフラ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?