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.
Unduh sampel Dockerfile untuk kontainer SQL Server non-root dan simpan sebagai
dockerfile
.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 .
Mulai kontainer.
Penting
Variabel
SA_PASSWORD
lingkungan tidak digunakan lagi. GunakanMSSQL_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.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.
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 menjadisql1.contoso.com,port
. Anda juga harus memastikan bahwa jalur/container/sql1/
folder sudah ada sebelum menjalankan perintah di atas.Pastikan Anda mengatur izin yang tepat pada
mssql.key
file danmssql.pem
, sehingga Anda menghindari kesalahan saat Memasang file ke kontainer SQL Server:chmod 440 /container/sql1/mssql.pem chmod 440 /container/sql1/mssql.key
Sekarang buat
mssql.conf
file dengan konten di bawah ini untuk mengaktifkan enkripsi Yang Dimulai Server. Untuk enkripsi yang dimulai Klien, ubah baris terakhir menjadiforceencryption = 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 yangmssql.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
, danmssql.pem
disql1
folder .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.conf
file , ,mssql.pem
danmssql.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-alihdocker 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.
Konten terkait
- 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