Bagikan melalui


Mengamankan kontainer SQL Server Linux

Berlaku untuk:SQL Server di 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 akan dijalankan sebagai pengguna mssql (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 Menjaga Keamanan Kontainer Linux SQL Server.

  1. Unduh file contoh Docker 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=<password>" --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 aktif di 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 flag pada perintah docker run. Kontainer non-root memiliki batasan bahwa ia harus dijalankan sebagai bagian dari grup root kecuali jika sebuah volume dipasang ke /var/opt/mssql yang dapat diakses oleh 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=<password>" --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 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=<password>" -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=<password>" --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=<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

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 kepada grup root untuk 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

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

chown -R 10001:0 <database file dir>

Mengenkripsi koneksi ke kontainer SQL Server Linux

Penting

Saat Anda mengonfigurasi opsi autentikasi atau enkripsi Direktori Aktif seperti Transparent Data Encryption (TDE) dan SSL/TLS untuk SQL Server di Linux atau kontainer, ada beberapa file, seperti keytab, sertifikat, dan kunci mesin, yang dibuat secara default di bawah folder /var/opt/mssql/secrets, dan akses ke yang dibatasi secara default ke mssql dan root pengguna. Saat Anda 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 Anda 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 sebelumnya.

  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 berikut 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 bisa /etc/pki/tls/certs/ dan /etc/pki/tls/private/ masing-masing. Verifikasi jalur sebelum memperbarui mssql.conf untuk kontainer SQL Server. Lokasi yang mssql.conf Anda tetapkan di adalah 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 (ganti <password> dengan kata sandi yang valid):

    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
    

    Dalam perintah sebelumnya, Anda 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 Red Hat Enterprise Linux 8 dan versi yang lebih baru, Anda juga dapat menggunakan podman run perintah alih-alih docker run.

Ikuti bagian "Daftarkan sertifikat di komputer klien Anda" dan "Contoh string koneksi" yang didokumentasikan dalam Enkripsi yang Dimulai oleh Klien untuk mulai melakukan enkripsi 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
  • Mulai menggunakan gambar kontainer SQL Server 2025 (17.x) di Docker dengan melalui mulai cepat