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.

Note

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. Daha fazla bilgi için, ana bilgisayarda farklı bir root olmayan kullanıcı olarak konteyneri çalıştır sayfasına bakabilirsiniz.

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

  2. Dockerfile'ı içeren dizinde kök olmayan SQL Server konteynerini oluşturmak için aşağıdaki komutu çalıştırın:

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

    Important

    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
    

    Note

    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. Konteynerin root olmayan bir kullanıcı olarak çalıştığını kontrol edin:

    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

Warning

SQL Server konteynerinin, mssql veya root gibi adlandırılmış bir kullanıcıya sahip olduğundan emin olun. Aksi takdirde, sqlcmd konteyner içinde çalışamaz. 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 root olmayan konteyneri root kullanıcı olarak çalıştırabilirsiniz, bu da daha yüksek ayrıcalıklara sahip olduğu için tüm dosya izinlerini konteynere otomatik olarak verir.

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

Root olmayan kullanıcının monte edilmiş hacimlerdeki veritabanı dosyalarına erişmesini sağlamak için, konteyneri çalıştırdığınız kullanıcı veya grubun kalıcı dosya depolamadan okuyup 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

Important

Active Directory kimlik doğrulama veya şifreleme seçeneklerini, örneğin Saydam Veri Şifrelemesi (TDE) ve TLS for Linux üzerinde SQL Server veya konteynerleri için yapılandırdığınızda, keytab, sertifikalar ve makine anahtarı gibi birkaç dosya varsayılan olarak klasörde /var/opt/mssql/secretsoluşturulur ve erişim varsayılan mssqlroot olarak kullanıcılarla sınırlıdı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,5434olacaktır. Önceki komutu çalıştırmadan önce klasör yolunun /container/sql1/ zaten var olduğundan da emin olmanız gerekir.

  2. Dosyaları SQL Server kapsayıcısına bağladığınızda hatalardan kaçınmak için mssql.pem ve mssql.key dosyalarında doğru izinleri ayarladığınızdan emin olun:

    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çerikle bir mssql.conf dosya oluşturun. İstemci tarafından başlatılan şifreleme için, son satırı 'ye değiştirin forceencryption = 0.

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

    Note

    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.pem, ve mssql.key dosyalarını konteynere monte mssql.confettiniz ve konteynerdeki SQL Server varsayılan portu 1433'ü ana bilgisayardaki 5434 portuna eşlediniz.

    Note

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

Müşteri başlatan şifrelemede belgelenen "Sertifikayı istemci makinenizde kaydet" ve "Bağlantı dizileri örneği" bölümlerini takip ederek Linux üzerinde SQL Server konteynerlerine bağlantıları şifrelemeye başlayın.

  • hızlı başlangıç kılavuzunu takip ederek Docker'da SQL Server 2017 (14.x) kapsayıcı imajlarını kullanmaya başlayın.
  • 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