SQL Server Linux コンテナーをセキュリティで保護する

適用対象:Linux 上の SQL Server

SQL Server 2017 (14.x) コンテナーは既定でルート ユーザーとして起動するため、セキュリティ上の問題が発生する可能性があります。 この記事では SQL Server Linux コンテナーを実行するときのセキュリティ オプションと、ルート以外のユーザーとして SQL Server コンテナーを構築する方法について説明します。

この記事の例では、Docker を使用していることを前提としていますが、Kubernetes などの他のコンテナー オーケストレーション ツールにも同じ原則を適用できます。

非ルート SQL Server 2017 コンテナーを作成して実行する

次の手順のようにして、mssql (非ルート) ユーザーとして起動する SQL Server 2017 (14.x) コンテナーを作成します。

Note

SQL Server 2019 (15.x) 以降のバージョンのコンテナーは自動的に非ルートとして起動するのに対し、SQL Server 2017 (14.x) のコンテナーは既定でルートとして起動します。 詳細については、 ホスト上の別の非rootユーザーとしてコンテナを実行することをご覧ください。

  1. 非ルート SQL Server コンテナー用のサンプル Dockerfile をダウンロードし、Dockerfile として保存します。

  2. Dockerファイルを含むディレクトリで、非rootのSQL Serverコンテナを構築するために次のコマンドを実行します:

    cd <path to Dockerfile directory>
    docker build -t 2017-latest-non-root .
    
  3. コンテナーを開始します。

    Important

    SA_PASSWORD 環境変数は非推奨です。 MSSQL_SA_PASSWORD を代わりに使用します。

    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" --cap-add SYS_PTRACE --name sql1 -p 1433:1433 -d 2017-latest-non-root
    

    Note

    非ルート SQL Server コンテナーによってトラブルシューティング用のダンプが生成されるようにするには、--cap-add SYS_PTRACE フラグが必要です。

  4. コンテナが非rootユーザーとして動作しているか確認してください:

    docker exec -it sql1 bash
    

    whoami を実行すると、コンテナーで実行されているユーザーが返されます。

    whoami
    

ホスト上で別の非ルート ユーザーとしてコンテナーを実行する

SQL Server コンテナーを別の非ルート ユーザーとして実行するには、-u フラグを docker run コマンドに追加します。 非ルート コンテナーには、非ルート ユーザーがアクセスできる root にボリュームがマウントされていない限り、/var/opt/mssql グループの一部として実行される必要がある制限があります。 root グループから非ルート ユーザーに対して追加のルート アクセス許可は付与されません。

UID 4000 を持つユーザーとして実行する

カスタム UID を使用して SQL Server を開始できます。 たとえば、次のコマンドでは UID 4000 を使用して SQL Server が開始されます。

docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" --cap-add SYS_PTRACE -u 4000:0 -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-latest

Warning

SQL Serverコンテナにmssqlやrootなどの名前付きユーザーがいることを確認してください。 そうでなければ、 sqlcmd コンテナ内で走ることができません。 SQL Server コンテナーが名前付きユーザーとして実行されているかどうかは、コンテナー内で whoami を実行することで確認できます。

非ルート コンテナーをルート ユーザーとして実行する

必要なら非rootコンテナをrootユーザーとして実行することもでき、これによりコンテナにすべてのファイル権限が自動的に付与されます。なぜならコンテナは高い権限を持っているからです。

docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -u 0:0 -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-latest

ご利用のホスト コンピューター上のユーザーとして実行する

次のコマンドを使用すれば、ホスト コンピューター上の既存のユーザーで SQL Server を開始できます。

docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" --cap-add SYS_PTRACE -u $(id -u myusername):0 -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-latest

別のユーザーおよびグループとして実行する

カスタムのユーザーおよびグループで SQL Server を開始できます。 この例では、マウントされたボリュームには、ホスト コンピューター上のユーザーまたはグループ用に構成されたアクセス許可があります。

docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" --cap-add SYS_PTRACE -u $(id -u myusername):$(id -g myusername) -v /path/to/mssql:/var/opt/mssql -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-latest

非ルート コンテナーに対して永続的なストレージ アクセス許可を構成する

非rootユーザーがマウントされたボリューム上のデータベースファイルにアクセスできるようにするには、コンテナを運用するユーザーやグループが永続ファイルストレージから読み書きできることを確認してください。

次のコマンドを使用すれば、データベース ファイルの現在の所有権を取得できます。

ls -ll <database file dir>

永続化されたデータベース ファイルへのアクセス権が SQL Server にない場合は、次のいずれかのコマンドを実行します。

データベース ファイルへの読み取り/書き込みアクセス権をルート グループに付与する

非ルート SQL Server コンテナーがデータベース ファイルにアクセスできるように、次のディレクトリへのアクセス許可をルート グループに付与します。

chgrp -R 0 <database file dir>
chmod -R g=u <database file dir>

非ルート ユーザーをファイルの所有者として設定する

所有者には、既定の非ルート ユーザー、または指定する他のルート以外のユーザーを指定できます。 この例では、非ルート ユーザーとして UID 10001 を設定します。

chown -R 10001:0 <database file dir>

SQL Server Linux コンテナーへの接続を暗号化する

Important

SQL Server on Linux またはコンテナーで、Active Directory 認証や、Transparent Data Encryption (TDE) や TLS などの暗号化オプションを構成すると、キータブ、証明書、マシン キーなどの複数のファイルが既定で /var/opt/mssql/secrets フォルダー配下に作成され、それらへのアクセスは既定で mssql ユーザーと root ユーザーのみに制限されています。 SQL Server コンテナーの永続ストレージを構成する場合は、同じアクセス戦略を使用して、コンテナー内の /var/opt/mssql/secrets フォルダーにマップされているホストまたは共有ボリューム上のパスが保護され、ホスト上の mssql および root ユーザーにのみアクセスできるようにします。 このパス/フォルダーへのアクセスが侵害されると、悪意のあるユーザーがこれらの重要なファイルにアクセスできるようになり、暗号化階層や Active Directory の構成が侵害されます。

SQL Server Linux コンテナーへの接続を暗号化するには、以下の要件を持つ証明書が必要です。

SQL Server Linux コンテナーへの接続を暗号化する方法の例を次に示します。 ここでは自己署名証明書を使用します。運用環境のシナリオでは使用しないでください。 このような環境では、代わりに CA 証明書を使用する必要があります。

  1. 自己署名証明書を作成します。これは、テスト環境と非運用環境のみに適しています。

    openssl req -x509 -nodes -newkey rsa:2048 -subj '/CN=sql1.contoso.com' -keyout /container/sql1/mssql.key -out /container/sql1/mssql.pem -days 365
    

    前のコード サンプルでは、sql1 は SQL コンテナーのホスト名であるため、このコンテナーに接続する場合、接続文字列で使用される名前は sql1.contoso.com,5434 になります。 また、前のコマンドを実行する前に、フォルダー パス /container/sql1/ が既に存在していることを確認する必要があります。

  2. mssql.keyファイルとmssql.pemファイルの権限を正しく設定し、ファイルをSQL Serverコンテナにマウントする際のエラーを避けるようにしてください:

    chmod 440 /container/sql1/mssql.pem
    chmod 440 /container/sql1/mssql.key
    
  3. 次に、以下の内容を含む mssql.conf ファイルを作成し、サーバー主導の暗号化を有効にします。 クライアント主導暗号化の場合は、最後の行を forceencryption = 0に変更してください。

    [network]
    tlscert = /etc/ssl/certs/mssql.pem
    tlskey = /etc/ssl/private/mssql.key
    tlsprotocols = 1.2
    forceencryption = 1
    

    Note

    一部の Linux ディストリビューションでは、証明書とキーを格納するためのパスをそれぞれ /etc/pki/tls/certs/ し、 /etc/pki/tls/private/ することもできます。 SQL Server コンテナーの mssql.conf を更新する前に、パスを確認します。 mssql.confで設定する場所は、コンテナー内の SQL Server が証明書とそのキーを検索する場所です。 この場合、その場所は /etc/ssl/certs/ と /etc/ssl/private/ になります。

    mssql.conf ファイルも、同じフォルダーの場所 /container/sql1/ の下に作成されます。 上記の手順を行うと、mssql.conf フォルダーに mssql.key、mssql.pem、sql1 の 3 つのファイルが作成されます。

  4. 次のコマンドを使用して SQL Server コンテナーをデプロイします ( <password> を有効なパスワードに置き換えます)。

    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -p 5434:1433 --name sql1 -h sql1 -v /container/sql1/mssql.conf:/var/opt/mssql/mssql.conf -v /container/sql1/mssql.pem:/etc/ssl/certs/mssql.pem -v /container/sql1/mssql.key:/etc/ssl/private/mssql.key -d mcr.microsoft.com/mssql/server:2019-latest
    

    前のコマンドでは、mssql.conf、mssql.pem、mssql.keyファイルをコンテナにマウントし、コンテナ内のSQL Serverデフォルトポート1433をホストのポート5434にマッピングしました。

    Note

    Red Hat Enterprise Linux 8 以降のバージョンを使用する場合は、podman runの代わりに docker run コマンドを使用することもできます。

クライアント主導暗号化に記載されている「クライアントマシンで証明書を登録する」と「接続文字列の例」セクションに従い、Linuxコンテナ上のSQL Server on Linuxへの接続の暗号化を開始してください。

  • クイックスタートに従って、Docker 上で SQL Server 2017 (14.x) のコンテナー イメージを開始する
  • クイックスタートに従って、Docker 上で SQL Server 2019 (15.x) のコンテナー イメージを開始する
  • クイックスタートに従って、Docker 上で SQL Server 2022 (16.x) のコンテナー イメージを開始する
  • クイックスタートに進み、Docker で SQL Server 2025 (17.x) コンテナー イメージの使用を開始する