SQL Server のセキュリティ強化 (Linux と Windows: 評価、ネットワーク、TLS、認証、権限、audit、TDE)
SQL Serverレベル: 中級所要時間: 5 分 (評価) ~ 3 時間 (完全なセキュリティ強化)インストールガイドではありません。稼働中の SQL Server 2019 / 2022 / 2025 インスタンス (Linux または Windows) のセキュリティ上の問題を見つけて塞ぎます。まず読み取り専用の セキュリティ評価 が問題を重要度順に一覧表示し、各検出事項がどのカードに対応するかを示します。その後、領域ごとに個別に、またはすべてを順番に対処します: 待ち受けアドレスと firewall、Force Encryption + 証明書とクライアント側の検証、sa の無効化とパスワードポリシー (CHECK_POLICY)、ロールと DDL 権限のないアプリケーションユーザー、攻撃対象領域 (xp_cmdshell、TRUSTWORTHY、guest)、Server Audit、TDE (証明書のバックアップは必須)、暗号化バックアップ、サービスアカウントとファイル権限、CU の追跡。TDE とバックアップの暗号化は Standard と Enterprise で利用できます (Express にはありません)。最後に評価を再実行します。
構成: 単一の SQL Server インスタンス (Linux または Windows) + アプリケーションサーバー。Always On AG は注記を参照
シナリオ
- セキュリティ評価: どこに問題があるか (読み取り専用) — 最初に実行するスキャンです: sa、パスワードポリシー、空のパスワード、sysadmin のメンバー、public/guest の権限、xp_cmdshell、暗号化されていない接続、audit、TDE と証明書のバックアップ、ポートと firewall。何も変更しません。
- 完全なセキュリティ強化 (すべてを順番に) — 新規インストール直後、または一度もセキュリティ強化していないインスタンス: すべての領域を安全な順序で適用します。SQL Server は 1~2 回再起動されます (メンテナンスウィンドウが必要です)。
- ネットワークと接続: 誰がどこから接続できるか (待ち受け、firewall、Browser) — SQL Server がすべてのインターフェイスで待ち受け、1433 が全体に公開され、SQL Browser が不要に動作しています。待ち受けアドレスを変更すると再起動が必要です。
- 接続を暗号化する (Force Encryption、証明書、クライアント側の検証) — 接続が暗号化されていないか、自己署名の一時証明書で暗号化されており、クライアントが TrustServerCertificate=true を使っています。証明書の変更には再起動が必要です。
- 認証とパスワード (sa、CHECK_POLICY、Windows 認証) — sa が有効、SQL ログインにパスワードポリシーがない、空/脆弱なパスワード。個人用 DBA アカウントの用意と sa の無効化。ダウンタイムはありません (Windows 認証のみへの切り替えだけは再起動が必要です)。
- 最小権限と攻撃対象領域 (ロール、public、guest、xp_cmdshell) — アプリケーションユーザーが db_owner または sysadmin、public/guest に余分な権限、xp_cmdshell/TRUSTWORTHY が有効。ロール設計と権限レポート。ダウンタイムはありません。
- Audit: 誰が何をしたか (Server Audit、Database Audit Specification) — 監査担当者がログイン、権限、スキーマ変更の記録を求めています。ファイル (または Windows イベントログ) への Server Audit、集中管理システムへの転送と保持。ダウンタイムはありません。すべてのエディションでライセンス不要です (2016 SP1 以降)。
- ディスク上のデータを暗号化する (TDE) — ディスク、データファイル、バックアップが別のサーバーで開かれることへの対策としての TDE: DMK、証明書、DEK。オンラインで実施できます。証明書のバックアップは必須です (失うとデータベースとそのバックアップを開けなくなります)。ライセンス: SQL Server 2019 以降の Standard と Enterprise で利用でき、Express にはありません。
- バックアップのセキュリティ (暗号化バックアップ、証明書、権限) — バックアップが暗号化されていない、バックアップディレクトリが全員に公開されている、スクリプトにパスワードが平文で書かれている。BACKUP … WITH ENCRYPTION、証明書のバックアップとディレクトリ権限。ダウンタイムはありません。バックアップの暗号化は Standard と Enterprise で利用でき、Express にはありません。
- OS 側 (サービスアカウント、ファイル権限、SELinux) — サービスが LocalSystem または管理者アカウントで動作している、データ/バックアップディレクトリが全員に公開されている、SELinux が無効。サービスアカウントの変更には再起動が必要です。
- パッチとバージョン: サポート対象のバージョンで最新の CU か — バージョン、CU レベル、サポート終了日 (2016 は 2026 年 7 月に終了)。適用には CU パッチのガイドへ案内します。読み取り専用です。
開始前の確認
- SQL Server が稼働しており、mssql-tools18 がインストール済みで、… が sysadmin であること。sqlcmd は /opt/mssql-tools18/bin/ 配下にあります (PATH には含まれないため、ガイドではフルパスを使います)。スクリプトを実行する前に、パスワードを画面に表示せずに変数へ読み込んでください: read -rsp 'Password: ' SQLCMDPASSWORD; export SQLCMDPASSWORD と sudo --preserve-env=SQLCMDPASSWORD bash <script>.sh。インストール: SQL Server の Linux へのインストール。
- 管理者権限の PowerShell セッションであること。サインインしている Windows アカウントが SQL Server で sysadmin であること (sqlcmd -E)。インストール: SQL Server の Windows へのインストール。
- セッションを 2 つ開いておくこと: 一方で手順を実行し、もう一方で sysadmin の接続 (sqlcmd) を開いたままにします。sa の無効化、firewall、Force Encryption、サービスの変更の後は、新しい接続を 別の セッションで試してください。元のセッションは閉じないでください。最後の手段: ローカルの DAC 接続 (sqlcmd -A) はサーバー自身からなら常に使えます。完全に締め出された場合は、シングルユーザーモード (…systemctl stop mssql-server; sudo -u mssql /opt/mssql/bin/sqlservr -m…net start … /m…) でローカル管理者が sysadmin としてログインできます。
- メンテナンスウィンドウ: 選択した領域では SQL Server が再起動されます (待ち受けアドレス、証明書/Force Encryption、サービスアカウント、認証モード)。… AG ではまずセカンダリレプリカで適用し、次に failover でプライマリを切り替えてから旧プライマリで適用してください。…
- 接続しているアプリケーションの一覧 (サーバー、ログイン、ドライバー)。評価のステップで現在接続中のものが表示されます。
- 最新の完全バックアップと master/msdb のバックアップがあること (バックアップガイド)。TDE とバックアップの暗号化では、証明書のバックアップがないとデータを復旧できません。
ガイドのフェーズ
- セキュリティ評価 (読み取り専用) — データベース内の検出事項を一覧表示する · OS 側を評価する · OS 側を評価する
- 開始前: 復元ポイント — ログイン、設定、構成のコピーを取得する · ログイン、設定、レジストリのコピーを取得する
- 認証 — 1. 診断 — ログイン、ポリシー、認証モードを表示する
- 認証 — 3. 適用 — アプリケーションとレポートのログインをポリシー付きで作成する · アプリケーションとレポートのログインをポリシー付きで作成する · 空またはログイン名と同じパスワードを変更する · 空またはログイン名と同じパスワードを変更する · 個人用 DBA アクセスを準備する · DBA の AD グループが sysadmin であることを確認する …
- 認証 — 4. 検証 — 認証の状態を確認する · アプリケーションサーバーから sa でのログインを試す · アプリケーションサーバーから sa でのログインを試す
- 権限 — 1. 診断 — サーバーとデータベースの権限を表示する
- 権限 — 3. 適用 — 攻撃対象領域を縮小する (sp_configure) · TRUSTWORTHY と guest アクセスを無効化する · ロール、スキーマ、ユーザーを作成する · アプリケーションユーザーを db_owner から外す · 権限レポート
- 権限 — 4. 検証 — アプリケーションユーザーが DDL を実行できないことを確認する
- TLS — 1. 診断 — 接続の暗号化状態を表示する
- TLS — 3. 適用 — テスト CA とサーバー証明書を作成する · キーと署名要求 (CSR) を作成する · 証明書とキーを検証する · 証明書と Force Encryption を構成する (mssql-conf) · SQL Server を再起動する · 証明書を作成またはインポートする …
- TLS — 4. 検証 — すべての TCP 接続が暗号化されていることを確認する
- TLS — 5. 事後作業: 証明書の更新 — 証明書の更新手順
- ネットワーク — 1. 診断: 誰がどこから接続しているか — 待ち受けアドレスとクライアントの接続元を表示する
- ネットワーク — 3. 適用 — 待ち受けアドレスを絞り込む (mssql-conf) · 待ち受けアドレスを絞り込む (TCP/IP IPn) · firewall でポートを許可されたネットワークにのみ開放する · firewall でポートを許可されたネットワークにのみ開放する · SQL Browser を無効化する (既定のインスタンス) · 待ち受けアドレスの変更のため SQL Server を再起動する …
- ネットワーク — 4. 検証 — アプリケーションサーバーから接続を試す (新しいセッション) · アプリケーションサーバーから接続を試す (新しいセッション)
- Audit — 1. 診断 — 既存の audit とログイン監査を表示する
- Audit — 2. セーフティネット — audit ディレクトリを準備する · audit ディレクトリを準備する
- Audit — 3. 適用 — Server Audit とサーバーレベルのイベントを定義する · アプリケーションスキーマのデータアクセスを記録する · audit の記録をエクスポートするスクリプト · エクスポート用のパスワードファイル、cron、rsyslog
- Audit — 4. 検証 — 変更を行い audit の記録で確認する
- バックアップ — 1. 診断 — バックアップの暗号化状態と証明書を表示する · バックアップディレクトリの権限 · バックアップディレクトリの権限
- バックアップ — 3. 適用 — バックアップ用証明書を作成し直ちにバックアップする · バックアップ用証明書を作成し直ちにバックアップする · 暗号化バックアップを取得し検証する · バックアップディレクトリの権限を修正する · バックアップディレクトリの権限を修正する
- OS — 1. 診断 — サービスアカウント、権限、SELinux · サービスアカウントとディレクトリの権限
- OS — 3. 適用 — mssql アカウントをロックしディレクトリの権限を修正する · SELinux を Enforcing のままにし SQL Server を制限する · サービスアカウントを仮想アカウントまたは gMSA にする · データディレクトリの権限を修正する
- TDE — 1. 診断 — 暗号化の状態と証明書を表示する
- TDE — 2. セーフティネット — TDE 前の完全バックアップ
- TDE — 3. 適用 — DMK と TDE 証明書を作成し直ちにバックアップする · DMK と TDE 証明書を作成し直ちにバックアップする · AG: TDE 証明書を他のレプリカに配置する · データベース暗号化キーを作成し TDE を有効にする · 暗号化が完了するまで監視する
- TDE — 4. 検証 — 暗号化されたデータベースと証明書のバックアップを確認する
- パッチとバージョン — 1. 診断 — バージョンと CU レベルを表示する · OS 側の保留中の更新
- パッチとバージョン — 5. 事後作業 — パッチ適用スケジュールを記録する
- 最終セキュリティ評価: 問題は解消されたか — セキュリティ評価を再実行する · OS 側を再評価する · OS 側を再評価する