Mengamankan kontainer SQL Server Linux

Berlaku untuk:SQL Server - Linux

Kontainer SQL Server 2017 (14.x) dimulai sebagai pengguna root secara default, yang dapat menyebabkan beberapa masalah keamanan. Artikel ini membahas tentang opsi keamanan yang Anda miliki saat menjalankan kontainer SQL Server Linux, dan cara membangun kontainer SQL Server sebagai pengguna non-root.

Contoh dalam artikel ini mengasumsikan bahwa Anda menggunakan Docker, tetapi Anda dapat menerapkan prinsip yang sama ke alat orkestrasi kontainer lainnya termasuk Kubernetes.

Membangun dan menjalankan kontainer SQL Server 2017 non-root

Ikuti langkah-langkah ini untuk membangun kontainer SQL Server 2017 (14.x) yang dimulai sebagai mssql pengguna (non-root).

Catatan

Kontainer untuk SQL Server 2019 (15.x) dan versi yang lebih baru secara otomatis dimulai sebagai non-root, sementara kontainer SQL Server 2017 (14.x) dimulai sebagai root secara default. Untuk informasi selengkapnya tentang menjalankan kontainer SQL Server sebagai non-root, lihat Mengonfigurasi keamanan.

  1. Unduh sampel Dockerfile untuk kontainer SQL Server non-root dan simpan sebagai dockerfile.

  2. Jalankan perintah berikut dalam konteks direktori dockerfile untuk membangun kontainer SQL Server non-root:

    cd <path to dockerfile>
    docker build -t 2017-latest-non-root .
    
  3. Mulai kontainer.

    Penting

    Variabel SA_PASSWORD lingkungan tidak digunakan lagi. Gunakan MSSQL_SA_PASSWORD sebagai gantinya.

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

    Catatan

    Bendera --cap-add SYS_PTRACE diperlukan untuk kontainer SQL Server non-root untuk menghasilkan cadangan untuk tujuan pemecahan masalah.

  4. Periksa apakah kontainer berjalan sebagai pengguna non-root:

    docker exec -it sql1 bash
    

    Jalankan whoami, yang mengembalikan pengguna yang berjalan dalam kontainer.

    whoami
    

Jalankan kontainer sebagai pengguna non-root yang berbeda pada host

Untuk menjalankan kontainer SQL Server sebagai pengguna non-root yang berbeda, tambahkan -u bendera ke docker run perintah . Kontainer non-root memiliki batasan yang harus dijalankan sebagai bagian root dari grup kecuali volume dipasang ke /var/opt/mssql yang dapat diakses pengguna non-root. Grup root tidak memberikan izin root tambahan kepada pengguna non-root.

Jalankan sebagai pengguna dengan UID 4000

Anda dapat memulai SQL Server dengan UID kustom. Misalnya, perintah berikut memulai SQL Server dengan UID 4000:

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

Peringatan

Pastikan bahwa kontainer SQL Server memiliki pengguna bernama seperti mssql atau root, jika tidak , sqlcmd tidak akan dapat berjalan dalam kontainer. Anda dapat memeriksa apakah kontainer SQL Server berjalan sebagai pengguna bernama dengan menjalankan whoami dalam kontainer.

Jalankan kontainer non-root sebagai pengguna root

Anda dapat menjalankan kontainer non-root sebagai pengguna root jika perlu, yang juga memberikan semua izin file secara otomatis ke kontainer, karena memiliki hak istimewa yang lebih tinggi.

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

Jalankan sebagai pengguna di komputer host Anda

Anda dapat memulai SQL Server dengan pengguna yang ada di komputer host dengan perintah berikut:

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

Jalankan sebagai pengguna dan grup yang berbeda

Anda dapat memulai SQL Server dengan pengguna dan grup kustom. Dalam contoh ini, volume yang dipasang memiliki izin yang dikonfigurasi untuk pengguna atau grup pada komputer host.

docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=MyStrongPassword" --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

Mengonfigurasi izin penyimpanan persisten untuk kontainer non-root

Untuk mengizinkan pengguna non-root mengakses file database yang ada pada volume yang dipasang, pastikan bahwa pengguna atau grup tempat Anda menjalankan kontainer, dapat membaca dari dan menulis ke penyimpanan file persisten.

Anda bisa mendapatkan kepemilikan file database saat ini dengan perintah ini.

ls -ll <database file dir>

Jalankan salah satu perintah berikut jika SQL Server tidak memiliki akses ke file database yang bertahan.

Memberikan akses baca/tulis grup akar ke file database

Berikan izin grup akar ke direktori berikut sehingga kontainer SQL Server non-root memiliki akses ke file database.

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

Atur pengguna non-root sebagai pemilik file

Ini bisa menjadi pengguna non-root default, atau pengguna non-root lainnya yang ingin Anda tentukan. Dalam contoh ini, kami menetapkan UID 10001 sebagai pengguna non-root.

chown -R 10001:0 <database file dir>

Mengenkripsi koneksi ke kontainer SQL Server Linux

Penting

Saat mengonfigurasi opsi autentikasi atau enkripsi Direktori Aktif seperti Transparent Data Encryption (TDE) dan SSL untuk SQL Server di Linux atau kontainer, ada beberapa file, seperti keytab, sertifikat, dan kunci komputer, yang dibuat secara default di bawah folder /var/opt/mssql/secrets, dan akses ke yang dibatasi secara default ke mssql dan root pengguna. Saat mengonfigurasi penyimpanan persisten untuk kontainer SQL Server, gunakan strategi akses yang sama, memastikan bahwa jalur pada host atau volume bersama yang dipetakan ke /var/opt/mssql/secrets folder di dalam kontainer dilindungi dan hanya dapat diakses oleh mssql pengguna dan root di host juga. Jika akses ke jalur/folder ini disusupi, pengguna berbahaya dapat memperoleh akses ke file-file penting ini, mengorbankan hierarki enkripsi dan/atau konfigurasi Direktori Aktif.

Untuk mengenkripsi koneksi ke kontainer SQL Server Linux, Anda memerlukan sertifikat dengan persyaratan berikut.

Berikut ini adalah contoh bagaimana koneksi dapat dienkripsi ke kontainer SQL Server Linux. Di sini kita menggunakan sertifikat yang ditandatangani sendiri, yang seharusnya tidak digunakan untuk skenario produksi. Untuk lingkungan tersebut, Anda harus menggunakan sertifikat CA sebagai gantinya.

  1. Buat sertifikat yang ditandatangani sendiri, yang cocok untuk lingkungan pengujian dan non-produksi saja.

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

    Dalam sampel kode sebelumnya, sql1 adalah nama host kontainer SQL, jadi saat menyambungkan ke kontainer ini, nama yang digunakan dalam string koneksi akan menjadi sql1.contoso.com,port. Anda juga harus memastikan bahwa jalur /container/sql1/ folder sudah ada sebelum menjalankan perintah di atas.

  2. Pastikan Anda mengatur izin yang tepat pada mssql.key file dan mssql.pem , sehingga Anda menghindari kesalahan saat Memasang file ke kontainer SQL Server:

    chmod 440 /container/sql1/mssql.pem
    chmod 440 /container/sql1/mssql.key
    
  3. Sekarang buat mssql.conf file dengan konten di bawah ini untuk mengaktifkan enkripsi Yang Dimulai Server. Untuk enkripsi yang dimulai Klien, ubah baris terakhir menjadi forceencryption = 0.

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

    Catatan

    Untuk beberapa distribusi Linux jalur untuk menyimpan sertifikat dan kunci juga dapat berupa : /etc/pki/tls/certs/ dan /etc/pki/tls/private/ masing-masing. Harap verifikasi jalur sebelum memperbarui mssql.conf untuk kontainer SQL Server. Lokasi yang mssql.conf Anda tetapkan di akan menjadi lokasi di mana SQL Server dalam kontainer akan mencari sertifikat dan kuncinya. Dalam hal ini, lokasi itu adalah /etc/ssl/certs/ dan /etc/ssl/private/.

    File mssql.conf juga dibuat di bawah lokasi /container/sql1/folder yang sama . Setelah menjalankan langkah-langkah di atas, Anda harus memiliki tiga file: mssql.conf, mssql.key, dan mssql.pem di sql1 folder .

  4. Sebarkan kontainer SQL Server dengan perintah berikut:

    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=P@ssw0rd" -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
    

    Dalam perintah sebelumnya, kami telah memasang mssql.conffile , , mssql.pemdan mssql.key ke kontainer dan memetakan port 1433 (port default SQL Server) dalam kontainer ke port 5434 pada host.

    Catatan

    Jika Anda menggunakan RHEL 8 ke atas, Anda juga dapat menggunakan podman run perintah alih-alih docker run.

Ikuti bagian "Daftarkan sertifikat di komputer klien Anda" dan "Contoh string koneksi" yang didokumenkan di Enkripsi yang Dimulai Klien untuk mulai mengenkripsi koneksi ke SQL Server pada kontainer Linux.

  • Mulai menggunakan gambar kontainer SQL Server 2017 (14.x) di Docker dengan melalui mulai cepat
  • Mulai menggunakan gambar kontainer SQL Server 2019 (15.x) di Docker dengan melalui mulai cepat
  • Mulai menggunakan gambar kontainer SQL Server 2022 (16.x) di Docker dengan melalui mulai cepat