Aracılığıyla paylaş


SQL Server Linux kapsayıcılarının güvenliğini sağlama

Şunlar için geçerlidir:Linux üzerinde SQL Server

SQL Server 2017 (14.x) kapsayıcıları varsayılan olarak kök kullanıcı olarak başlatılır ve bu da bazı güvenlik sorunlarına neden olabilir. Bu makalede, SQL Server Linux kapsayıcılarını çalıştırırken sahip olduğunuz güvenlik seçenekleri ve kök olmayan kullanıcı olarak SQL Server kapsayıcısı oluşturma hakkında bilgi verilmektedir.

Bu makaledeki örneklerde Docker kullandığınız varsayılır, ancak kubernetes gibi diğer kapsayıcı düzenleme araçlarına da aynı ilkeleri uygulayabilirsiniz.

Root yetkisi olmayan SQL Server 2017 kapsayıcılarını oluşturma ve çalıştırma

SQL Server 2017 (14.x) kapsayıcısını, mssql (kök olmayan) kullanıcı olarak başlatmak için bu adımları izleyin.

Not

SQL Server 2019 (15.x) ve sonraki sürümleri için kapsayıcılar otomatik olarak kök olmayan olarak başlatılırken, SQL Server 2017 (14.x) kapsayıcıları varsayılan olarak kök olarak başlar. SQL Server kapsayıcılarını kök olmayan olarak çalıştırma hakkında daha fazla bilgi için bkz. güvenli SQL Server Linux kapsayıcıları .

  1. kök olmayan SQL Server kapsayıcıları için örnek Dockerfile dosyasını indirin ve dockerfileolarak kaydedin.

  2. Kök olmayan SQL Server kapsayıcısını oluşturmak için dockerfile dizini bağlamında aşağıdaki komutu çalıştırın:

    cd <path to dockerfile>
    docker build -t 2017-latest-non-root .
    
  3. Kapsayıcıyı başlatın.

    Önemli

    SA_PASSWORD ortam değişkeni kullanım dışıdır. Bunun yerine MSSQL_SA_PASSWORD kullanın.

    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
    

    Not

    Kök olmayan SQL Server kapsayıcılarının sorun giderme amacıyla dökümler oluşturması için --cap-add SYS_PTRACE bayrağı gereklidir.

  4. Kapsayıcının kök olmayan kullanıcı olarak çalışıp çalışmadığını denetleyin:

    docker exec -it sql1 bash
    

    Çalıştırın whoami, bu, kapsayıcı içinde çalışan kullanıcıyı döndüren bir işlemdir.

    whoami
    

Kapsayıcıyı konakta kök olmayan farklı bir kullanıcı olarak çalıştırma

SQL Server kapsayıcısını farklı bir kök olmayan kullanıcı olarak çalıştırmak için -u komutuna docker run bayrağını ekleyin. Kök olmayan kapsayıcı, kök olmayan kullanıcının erişebileceği bir birim root'e bağlanmadığı takdirde /var/opt/mssql grubunun bir parçası olarak çalışması zorunluluğuna sahiptir. root grubu, kök olmayan kullanıcıya ek kök izinleri vermez.

UID 4000 ile kullanıcı olarak çalıştırma

SQL Server'ı özel bir UID ile başlatabilirsiniz. Örneğin, aşağıdaki komut UID 4000 ile SQL Server'ı başlatır:

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

Uyarı

SQL Server kapsayıcısında mssql veya root gibi adlandırılmış bir kullanıcı olduğundan emin olun, aksi takdirde sqlcmd kapsayıcı içinde çalıştırılamaz. Kapsayıcı içinde whoami çalıştırarak SQL Server kapsayıcısının adlandırılmış kullanıcı olarak çalışıp çalışmadığını de kontrol edebilirsiniz.

Kök olmayan kapsayıcıyı kök kullanıcı olarak çalıştırma

Gerekirse kök olmayan kapsayıcıyı kök kullanıcı olarak çalıştırabilirsiniz; bu da kapsayıcıya otomatik olarak tüm dosya izinlerini verir çünkü daha yüksek ayrıcalığı vardır.

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

Konak makinenizde kullanıcı olarak çalıştırma

SQL Server'ı aşağıdaki komutla konak makinede var olan bir kullanıcıyla başlatabilirsiniz:

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

Farklı bir kullanıcı ve grup olarak çalıştır

SQL Server'ı özel bir kullanıcı ve grupla başlatabilirsiniz. Bu örnekte, bağlı birimin konak makinedeki kullanıcı veya grup için yapılandırılmış izinleri vardır.

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

Kök olmayan kapsayıcılar için kalıcı depolama izinlerini yapılandırma

Kök olmayan kullanıcının bağlı birimlerdeki veritabanı dosyalarına erişmesine izin vermek için, kapsayıcıyı çalıştırdığınız kullanıcının veya grubun kalıcı dosya depolama alanını okuyabildiğinden ve yazabildiğinden emin olun.

Bu komutla veritabanı dosyalarının geçerli sahipliğini alabilirsiniz.

ls -ll <database file dir>

SQL Server'ın kalıcı veritabanı dosyalarına erişimi yoksa aşağıdaki komutlardan birini çalıştırın.

Kök gruba veritabanı dosyalarına okuma/yazma erişimi verme

Kök olmayan SQL Server kapsayıcısının veritabanı dosyalarına erişebilmesi için aşağıdaki dizinlere kök grup izinleri verin.

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

Kök olmayan kullanıcıyı dosyaların sahibi olarak ayarlayın

Sahip, varsayılan kök olmayan kullanıcı veya belirtmek istediğiniz diğer kök olmayan kullanıcı olabilir. Bu örnekte UID 10001'i kök olmayan kullanıcı olarak ayarlamış olacaksınız.

chown -R 10001:0 <database file dir>

SQL Server Linux kapsayıcılarına bağlantıları şifreleme

Önemli

Linux veya kapsayıcılarda SQL Server için Saydam Veri Şifrelemesi (TDE) ve SSL/TLS gibi Active Directory kimlik doğrulaması veya şifreleme seçeneklerini yapılandırdığınızda, klasörü /var/opt/mssql/secretsaltında varsayılan olarak oluşturulan ve erişimi ve mssql kullanıcıları tarafından kısıtlanan root anahtar sekmesi, sertifikalar ve makine anahtarı gibi birkaç dosya vardır. SQL Server kapsayıcıları için kalıcı depolamayı yapılandırırken aynı erişim stratejisini kullanın; kapsayıcı içindeki /var/opt/mssql/secrets klasörüne eşlenen konak veya paylaşılan birimdeki yolun korunduğundan ve yalnızca konak üzerindeki mssql ve root kullanıcılarının erişimiyle sınırlı olduğundan emin olun. Bu yol/klasöre erişimin gizliliği ihlal edilirse, kötü amaçlı bir kullanıcı bu kritik dosyalara erişim elde ederek şifreleme hiyerarşisini ve/veya Active Directory yapılandırmalarını tehlikeye atabilir.

SQL Server Linux kapsayıcılarına bağlantıları şifrelemek için aşağıdaki gereksinimleresahip bir sertifikaya ihtiyacınız vardır.

Aşağıda SQL Server Linux kapsayıcılarına bağlantının nasıl şifreleneceğine ilişkin bir örnek verilmiştir. Burada üretim senaryoları için kullanılmaması gereken kendinden imzalı bir sertifika kullanıyorsunuz. Bu tür ortamlar için bunun yerine CA sertifikalarını kullanmanız gerekir.

  1. Yalnızca test ve üretim dışı ortamlar için uygun olan otomatik olarak imzalanan bir sertifika oluşturun.

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

    Önceki kod örneğinde sql1 SQL kapsayıcısının ana bilgisayar adıdır, bu nedenle bu kapsayıcıya bağlanırken bağlantı dizesinde kullanılan ad sql1.contoso.com,portolacaktır. Önceki komutu çalıştırmadan önce klasör yolunun /container/sql1/ zaten var olduğundan da emin olmanız gerekir.

  2. mssql.key ve mssql.pem dosyaları üzerinde doğru izinleri ayarladığınızdan emin olun; böylece dosyaları SQL Server kapsayıcısına bağlarken hatalardan kaçınırsınız:

    chmod 440 /container/sql1/mssql.pem
    chmod 440 /container/sql1/mssql.key
    
  3. Şimdi Sunucu Tarafından Başlatılan şifrelemeyi etkinleştirmek için aşağıdaki içeriğe sahip bir mssql.conf dosya oluşturun. İstemci tarafından başlatılan şifreleme için son satırı forceencryption = 0olarak değiştirin.

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

    Not

    Bazı Linux dağıtımları için, sertifikayı ve anahtarı depolama yolu sırasıyla /etc/pki/tls/certs/ ve /etc/pki/tls/private/ olabilir. SQL Server kapsayıcıları için mssql.conf güncelleştirmeden önce yolu kontrol edin. içinde mssql.conf ayarladığınız konum, kapsayıcıdaki SQL Server'ın sertifikayı ve anahtarını arayacağı konumdur. Bu durumda, o konum /etc/ssl/certs/ ve /etc/ssl/private/.

    mssql.conf dosyası da /container/sql1/aynı klasör konumu altında oluşturulur. Yukarıdaki adımları çalıştırdıktan sonra üç dosyanız olmalıdır: mssql.conf klasöründe mssql.key, mssql.pemve sql1.

  4. SQL Server kapsayıcısını aşağıdaki komutla dağıtın (<password> geçerli bir parolayla değiştirin):

    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
    

    Önceki komutta, mssql.conf, mssql.pem ve mssql.key dosyalarını kapsayıcıya bağladınız ve kapsayıcıdaki 1433 (SQL Server varsayılan bağlantı noktası) bağlantı noktasını konaktaki 5434 numaralı bağlantı noktasına eşlediniz.

    Not

    Red Hat Enterprise Linux 8 ve sonraki sürümlerini kullanıyorsanız, podman run yerine docker run komutunu da kullanabilirsiniz.

Linux kapsayıcılarında SQL Server bağlantılarını şifrelemeye başlamak için İstemci Tarafından Başlatılan Şifreleme belgelenen "İstemci makinenize sertifikayı kaydedin" ve "Örnek bağlantı dizeleri" bölümlerini izleyin.

  • hızlı başlangıç kullanarak Docker'da SQL Server 2017 (14.x) kapsayıcı görüntülerine başlamaya başla.
  • hızlı başlangıç ilerleyerek Docker'da SQL Server 2019 (15.x) kapsayıcı görüntülerini kullanmaya başlayın
  • Hızlı başlangıcı izleyerek Docker'da SQL Server 2025 (17.x) kapsayıcı görüntülerini kullanmaya başlama