はじめに
OpenClaw は複数のチャットプラットフォームを接続する AI ゲートウェイとして、セキュリティが非常に重要です。未認可のユーザーによる不正利用が発生すると、高額な API 費用が発生するだけでなく、機密情報の漏洩にもつながりかねません。本チュートリアルでは、ダッシュボードの認証、ユーザーアクセス制御、レート制限、監査ログなど、複数の観点から OpenClaw のセキュリティを強化する方法をご紹介します。
セキュリティ脅威の概要
| 脅威タイプ | リスクレベル | 説明 |
|---|---|---|
| ダッシュボードへの未認可アクセス | 高 | 攻撃者が設定を変更したり、会話を閲覧したりする可能性 |
| API Key の漏洩 | 高 | 他者が API クレジットを不正使用する可能性 |
| ユーザーによる濫用 | 中 | 認可ユーザーの過度な使用による高額費用 |
| 会話内容の漏洩 | 中 | 会話記録への未認可アクセス |
| DDoS 攻撃 | 中 | 悪意のあるリクエストによるサービス停止 |
| インジェクション攻撃 | 低 | 悪意のあるプロンプトで AI の動作を操作 |
ステップ1:ダッシュボードの認証
1.1 パスワード認証の有効化
デフォルトではダッシュボードにパスワード保護がない場合があります。直ちに設定してください:
{
dashboard: {
enabled: true,
port: 18789,
auth: {
enabled: true,
username: "admin",
password: "${OPENCLAW_DASHBOARD_PASSWORD}", // 環境変数を使用
}
}
}
環境変数を設定します:
# 強力なパスワードを生成
openssl rand -base64 32
# 出力例:K7x9mP2vQ4wR1tY6uI3oA8sD5fG0hJ=
# 環境変数に追加
echo 'export OPENCLAW_DASHBOARD_PASSWORD="K7x9mP2vQ4wR1tY6uI3oA8sD5fG0hJ="' >> ~/.bashrc
source ~/.bashrc
1.2 セッション管理の設定
{
dashboard: {
auth: {
enabled: true,
username: "admin",
password: "${OPENCLAW_DASHBOARD_PASSWORD}",
session: {
timeout: 3600, // セッション有効期限(秒)、1時間
maxSessions: 3, // 同時ログイン数の上限
secureCookie: true, // HTTPS 経由のみ Cookie を送信
}
}
}
}
1.3 マルチユーザー管理
チームで OpenClaw を管理する必要がある場合:
{
dashboard: {
auth: {
enabled: true,
users: [
{
username: "admin",
password: "${ADMIN_PASSWORD}",
role: "admin", // 完全な制御権限
},
{
username: "operator",
password: "${OPERATOR_PASSWORD}",
role: "operator", // ログとステータスの閲覧可能、設定の変更は不可
},
{
username: "viewer",
password: "${VIEWER_PASSWORD}",
role: "viewer", // 読み取り専用権限
}
]
}
}
}
ロール別の権限比較:
| 権限 | admin | operator | viewer |
|---|---|---|---|
| ダッシュボードの閲覧 | ✓ | ✓ | ✓ |
| ログの閲覧 | ✓ | ✓ | ✓ |
| 会話記録の閲覧 | ✓ | ✓ | ✗ |
| 設定の変更 | ✓ | ✗ | ✗ |
| ユーザー管理 | ✓ | ✗ | ✗ |
| サービスの再起動 | ✓ | ✓ | ✗ |
ステップ2:API Key の保護
2.1 環境変数での保存(必須)
API Key を設定ファイルに平文で記述してはいけません:
// 悪い例 ✗
{
models: {
openai: {
apiKey: "sk-proj-abc123..." // このように書かないでください!
}
}
}
// 正しい方法 ✓
{
models: {
openai: {
apiKey: "${OPENAI_API_KEY}" // 環境変数で参照
}
}
}
2.2 ファイルパーミッションの制御
# 設定ファイルのパーミッションを制限
chmod 600 ~/.config/openclaw/openclaw.json5
# ファイル所有者を確認
chown $(whoami) ~/.config/openclaw/openclaw.json5
# パーミッションを確認
ls -la ~/.config/openclaw/openclaw.json5
# -rw------- と表示されるはず(所有者のみ読み書き可能)
2.3 Git からの除外
Git で設定を管理している場合、機密ファイルが除外されていることを確認してください:
# .gitignore に追加
echo "openclaw.json5" >> ~/.config/openclaw/.gitignore
echo ".env" >> ~/.config/openclaw/.gitignore
echo "*.key" >> ~/.config/openclaw/.gitignore
echo "*.pem" >> ~/.config/openclaw/.gitignore
ステップ3:ユーザーホワイトリスト / ブラックリスト
3.1 ユーザーホワイトリスト(推奨)
指定したユーザーのみ AI アシスタントの使用を許可します:
{
accessControl: {
mode: "whitelist", // whitelist または blacklist
whitelist: {
telegram: [
"123456789", // Telegram ユーザー ID
"987654321",
],
whatsapp: [
"+8613800138000", // WhatsApp 電話番号
"+8613900139000",
],
discord: [
"112233445566778899", // Discord ユーザー ID
]
},
denyMessage: "抱歉,你没有使用该助手的权限。请联系管理员。",
}
}
3.2 ユーザーブラックリスト
大部分のユーザーが使用可能で、個別のユーザーのみブロックする場合:
{
accessControl: {
mode: "blacklist",
blacklist: {
telegram: [
"111111111", // ブロックされたユーザー
],
global: [
"[email protected]", // 全チャンネルでブロック
]
},
blockMessage: "你的访问权限已被暂停。",
}
}
3.3 グループ権限の制御
グループ内のボットについて、使用を許可するグループを制限できます:
{
accessControl: {
groups: {
telegram: {
allowedGroups: [
"-1001234567890", // 許可されたグループ ID
"-1009876543210",
],
allowPrivate: true, // プライベートチャットを許可
},
discord: {
allowedServers: [
"1234567890123456", // 許可されたサーバー ID
],
allowedChannels: [
"9876543210987654", // 許可されたチャンネル ID(より細かい制御)
]
}
}
}
}
ステップ4:レート制限
4.1 グローバルレート制限
単一ユーザーの過度な使用を防止します:
{
rateLimit: {
global: {
maxRequestsPerMinute: 30, // グローバルで1分あたり最大30リクエスト
maxRequestsPerHour: 500, // グローバルで1時間あたり最大500リクエスト
maxRequestsPerDay: 5000, // グローバルで1日あたり最大5000リクエスト
}
}
}
4.2 ユーザー別レート制限
{
rateLimit: {
perUser: {
maxRequestsPerMinute: 5, // ユーザーあたり1分に5回
maxRequestsPerHour: 60, // ユーザーあたり1時間に60回
maxRequestsPerDay: 500, // ユーザーあたり1日に500回
cooldownMessage: "你发送消息太频繁了,请稍后再试。",
}
}
}
4.3 階層別レート制限
異なるユーザーグループに異なる制限を設定します:
{
rateLimit: {
tiers: {
vip: {
users: ["123456789", "+8613800138000"],
maxRequestsPerMinute: 20,
maxRequestsPerDay: 2000,
},
standard: {
default: true, // 未指定のユーザーはこのレベルを使用
maxRequestsPerMinute: 5,
maxRequestsPerDay: 200,
},
restricted: {
users: ["987654321"],
maxRequestsPerMinute: 1,
maxRequestsPerDay: 20,
}
}
}
}
ステップ5:IP 制限
5.1 ダッシュボードの IP ホワイトリスト
特定の IP のみダッシュボードへのアクセスを許可します:
{
dashboard: {
auth: {
enabled: true,
username: "admin",
password: "${OPENCLAW_DASHBOARD_PASSWORD}",
},
ipWhitelist: [
"203.0.113.0/24", // オフィスの IP レンジ
"198.51.100.1", // 自宅の IP
"127.0.0.1", // ローカルアクセス
]
}
}
5.2 ファイアウォールによる制限
システムレベルの IP 制限はより確実です:
# ufw を使用(Ubuntu)
sudo ufw allow from 203.0.113.0/24 to any port 18789
sudo ufw deny 18789
# iptables を使用
sudo iptables -A INPUT -p tcp --dport 18789 -s 203.0.113.0/24 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 18789 -j DROP
5.3 Fail2ban によるブルートフォース対策
Fail2ban を設定して、ログイン失敗が続く IP を自動的にブロックします:
sudo apt install fail2ban
OpenClaw 用の Fail2ban ルールを作成します:
sudo nano /etc/fail2ban/jail.d/openclaw.conf
[openclaw]
enabled = true
port = 18789
filter = openclaw
logpath = /var/log/openclaw/access.log
maxretry = 5
findtime = 600
bantime = 3600
フィルターの作成:
sudo nano /etc/fail2ban/filter.d/openclaw.conf
[Definition]
failregex = ^.*authentication failed.*from <HOST>.*$
ignoreregex =
sudo systemctl restart fail2ban
ステップ6:監査ログ
6.1 詳細ログの有効化
{
logging: {
level: "info", // debug, info, warn, error
file: "/var/log/openclaw/openclaw.log",
audit: {
enabled: true,
file: "/var/log/openclaw/audit.log",
events: [
"auth.login", // ログインイベント
"auth.failed", // ログイン失敗
"config.change", // 設定変更
"user.blocked", // ユーザーブロック
"rateLimit.exceeded", // レート制限トリガー
"message.received", // メッセージ受信(任意、大量になる場合あり)
]
}
}
}
6.2 ログローテーション
ログファイルの無限増大を防止します:
sudo nano /etc/logrotate.d/openclaw
/var/log/openclaw/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 640 openclaw openclaw
postrotate
openclaw restart > /dev/null 2>&1 || true
endscript
}
6.3 監査ログの確認
# 最近の監査イベントを確認
openclaw logs --audit --since 24h
# ログイン失敗イベントのフィルタリング
openclaw logs --audit --filter "auth.failed"
# 特定ユーザーのアクティビティを確認
openclaw logs --audit --user "123456789"
ステップ7:セキュリティのベストプラクティスチェックリスト
デプロイ前のチェック
# セキュリティチェックを実行
openclaw doctor --security
セキュリティチェックリスト
| チェック項目 | 状態 | 説明 |
|---|---|---|
| ダッシュボードのパスワードが設定済み | □ | 最低16文字の強力なパスワードを使用 |
| API Key が環境変数で管理されている | □ | 設定ファイルに平文で保存しない |
| 設定ファイルのパーミッションが 600 | □ | 所有者のみ読み書き可能 |
| HTTPS が有効化されている | □ | 本番環境では必須 |
| ユーザーホワイトリストが設定済み | □ | 誰が使用できるかを制限 |
| レート制限が有効化されている | □ | 濫用を防止 |
| 監査ログが有効化されている | □ | 重要な操作を記録 |
| ファイアウォールが設定済み | □ | 必要なポートのみ開放 |
| 自動更新が有効化されている | □ | セキュリティ脆弱性を速やかに修正 |
| 定期バックアップ | □ | データ消失を防止 |
定期的なセキュリティメンテナンス
# 毎週:監査ログの異常を確認
openclaw logs --audit --since 7d --filter "auth.failed"
# 毎月:OpenClaw を最新バージョンに更新
npm update -g openclaw@latest
# 毎月:ダッシュボードのパスワードをローテーション
# 環境変数のパスワードを更新後に再起動
# 四半期:ホワイトリストを見直し、非アクティブユーザーを削除
よくある質問
ダッシュボードのパスワードを忘れた場合
# 環境変数のパスワードを直接変更
export OPENCLAW_DASHBOARD_PASSWORD="新しいパスワード"
openclaw restart
自分の IP を誤ってブロックしてしまった場合
# SSH でサーバーにログイン後
# Fail2ban によるブロックの場合
sudo fail2ban-client set openclaw unbanip あなたのIP
# 設定ファイルの IP ホワイトリストの場合
# 設定ファイルを編集して IP を追加し、再起動
openclaw restart
レート制限が厳しすぎる場合
ログの rateLimit.exceeded イベントの頻度を観察し、適切に調整します:
openclaw logs --audit --filter "rateLimit.exceeded" --since 24h
実際の使用状況に応じて制限値を調整してください。
まとめ
セキュリティ強化は、本番レベルの OpenClaw インスタンスを運用するための必須ステップです。核心的な対策は、ダッシュボード認証の有効化、環境変数による API Key の保護、ユーザーホワイトリストの設定、レート制限の有効化、監査ログの有効化です。これらの対策は複雑ではありませんが、セキュリティを大幅に向上させます。本記事のセキュリティチェックリストに沿って一つずつ確認・設定し、AI アシスタントが安全で管理された環境で動作するようにしてください。