痛みの分解:セキュリティとデリバリの速度が正面衝突する
公開SFTPでは「早く落としたい」防御と「短時間並列アップロード」ビルドが衝突し、閾値未共有だとネット障害に見えがちですが実態は MaxAuthTries とFWの不整合であることが多いです。
公開鍵のみでもスキャナは握手コストを払います。CI側ホスト鍵ズレはログ上は攻撃に似ます。LoginGraceTime 過小は初回確認中の海外メンバーを切ります。マトリックスは失敗を瞬間堆積させ、Match User 未分割だと単一パイプラインが全体バジェットを占有します。
脅威モデル:スキャンとCIジッタを混ぜない
ブルートフォースは分散ユーザー名と機械間隔が目印。CIジッタは固定アカウントとDNS/バスチョン変更直後に相関。同一カウンタではジレンマのみ残ります。層分けし、ホスト鍵正を前提に MaxAuthTries/LoginGraceTime を単接続の試行上限と猶予に位置づけ。バスチョンは外向き厳・内向きやや寛で連鎖ロック回避。
測定可能な基線:比率で語る
IP別に失敗/成功を比較し分散ならスキャン、単一鍵集中なら鍵イベント。「再試行×並列÷秒」で理論ピークを紙に。LoginGraceTime はRTT P95。リリース直後急増は鍵不整合寄り。SHA256失敗はSSHと分桶。
macOSでFail2ban前提は負債になりやすい。先にパスワード閉鎖とed25519、Match 段階化、必要なら Tailscale/Headscale で面縮小。
判断表:試行上限・猶予・外側BAN・CI許可
| コントロール | 向く場面 | 利点 | リスク |
|---|---|---|---|
| MaxAuthTriesだけ上げる | 鍵インシデントの応急 | 即効 | パスワード残存時に窓が広がる |
| 厳しめMaxAuthTries+鍵のみ | 公網入口 | パスワード面を縮小 | 誤鍵は早く落ちる→ワークフロー退避必須 |
| 短いLoginGraceTime | 半開乱用 | CPU節約 | 高RTTユーザーが切れる |
| クラウドFWレート制限 | スキャン嵐 | sshd前で吸収 | 閾値ミスでCIバースト誤爆 |
| Fail2ban系 | 安定ログのLinux | 自動応答 | 共有NATの誤検知 |
| メッシュ/私設網 | 設計変更可 | 露出縮小 | ルーティングとACLコスト |
パスワード経路の残存、CIが共有NATか、バスチョンが単点か——いずれかがYesなら単一ノブに依存しないでください。
sshd設定スケッチ(例)
# sshd_config 断片(環境に合わせて調整)
# PasswordAuthentication no
# KbdInteractiveAuthentication no
# MaxAuthTries 4
# LoginGraceTime 45
# ClientAliveInterval 30
# ClientAliveCountMax 4
# Match User ci-upload
# MaxAuthTries 6
# ForceCommand internal-sftp -d /Volumes/artifacts
# Actions: 認証失敗後に指数バックオフのsleepを入れる
実装ステップ:役割分離から訓練まで
1) Match で人間とCIアップロードを分離。2) internal-sftp/chrootの所有者確認。3) MaxSessions を実並列に合わせ OIDC/デプロイ鍵 と同じ列車へ。4) StrictHostKeyChecking=yes と UserKnownHostsFile をSecretsへ。5) 大規模ローテで自動BAN緩め、FWは二名承認。6) ステージングで誤鍵訓練、ホスト検査を切らない復旧を確認。
監査はセッションカウントとチェックサムを同票に。SIEMへ秘密は送らない。ホスト鍵二鍵併存を文書化。遅延握手・大容量SFTPを試験しkeepalive調整。再試行にジッタ、セルフホスト出口はホステッドと閾値分離。
アップグレード差分やログ統合が重いなら SFTPMAC ホスト型へ寄せ、トレードオフをサービス境界へ移すのも合理的です。
推奨読書順(内部リンクのみ)
known_hosts固定 → OIDCと最小権限 → 並列SFTP → バスチョン → 任意で mesh → トップ。
FAQ、チェックリスト、ホスティングへの橋渡し
公開SFTPは MaxAuthTries・LoginGraceTime・鍵のみ・ホスト検査・セッション予算を同一runbookにし、外側限速でスキャンを吸収します。自前は観測コストが重く、SFTPMAC はAppleネイティブの受け皿になります。
一枚紙:パスワードoff、Match、役割別MaxAuthTries、LoginGraceTimeのRTT根拠、MaxSessions、known_hostsピン、BAN責任者、ホスト検査を切らない復旧。
