Docker Kapsayıcılarındaki İşlemler Neden Kök Olarak Çalışmamalı?

Yayınlanan: 2022-08-19

Docker logosunu gösteren grafik

Docker kapsayıcısındaki işlemler kök olarak çalıştırılmamalıdır. Uygulamalarınızı, Dockerfile dosyanızın bir parçası olarak veya docker run kullanırken belirttiğiniz root olmayan bir kullanıcı olarak çalıştırmak daha güvenlidir. Bu, kapsayıcınızdaki herhangi bir tehdide karşı azaltılmış bir saldırı yüzeyi sunarak riski en aza indirir.

Bu makalede, kapsayıcılı uygulamaları root olarak çalıştırmanın tehlikeleri hakkında bilgi edineceksiniz. Ayrıca, root olmayan bir kullanıcıyı nasıl oluşturacağınızı ve bunun mümkün olmadığı durumlarda ad alanını nasıl ayarlayacağınızı da göreceksiniz.

Koşmak Neden Kök Tehlikeli?

Kapsayıcılar varsayılan olarak kök olarak çalıştırılır. Docker arka plan programı, ana makinenizde kök olarak yürütülür ve çalışan kapsayıcılar da kök olacaktır.

Kapsayıcının içindeki kök bağımsız bir kullanıcı gibi görünse de, aslında ana makinenizdeki kök hesapla aynıdır. Ayırma yalnızca Docker'ın kapsayıcı yalıtım mekanizmaları tarafından sağlanır. Güçlü bir fiziksel sınır yoktur; kapsayıcınızın, ana makinenizin çekirdeğindeki kök kullanıcı tarafından çalıştırılan başka bir işlemidir. Bu, uygulamanızdaki, Docker çalışma zamanındaki veya Linux çekirdeğindeki bir güvenlik açığının, saldırganların kapsayıcıyı kırmasına ve makinenizde kök ayrıcalıklı işlemler gerçekleştirmesine izin verebileceği anlamına gelir.

Bunun olma riskini azaltan bazı yerleşik korumalar vardır. Kapsayıcının içindeki kök ayrıcalığa sahip değildir ve sınırlı yeteneklere sahiptir. Bu, kapsayıcılarınızı başlatırken el ile yetenek eklemediğiniz veya ayrıcalıklı modu kullanmadığınız sürece kapsayıcının sistem yönetimi komutlarını kullanmasını engeller.

Bu hafifletmeye rağmen, uygulamaların root olarak çalışmasına izin vermek bir tehlike olmaya devam ediyor. Tıpkı geleneksel bir ortamda root kullanımını kısıtladığınız gibi, onu kapsayıcılarınızda gereksiz yere kullanmak akıllıca değildir. Bir ihlal olması durumunda saldırganlara daha fazla dayanak sağlayan aşırı ayrıcalıklı bir ortam sağlıyorsunuz.

Kapsayıcı Uygulamaları Kök Olmayan Kullanıcı Olarak Çalıştırma

Kapsayıcılı uygulamaların normal bir kullanıcı olarak çalışması en iyi uygulamadır. Çoğu yazılım kök erişimine ihtiyaç duymaz, bu nedenle kullanıcıyı değiştirmek, kapsayıcı kopmasına karşı anında bir savunma katmanı sağlar.

Dockerfile'nizdeki son aşamalardan biri olarak yeni bir kullanıcı hesabı oluşturmalısınız. Bunu USER talimatıyla başarabilirsiniz:

 Temel görüntüden:en son
RUN apt kurulum demo paketi
KULLANICI demo kullanıcısı:demo grubu
GİRİŞ NOKTASI ["demo-ikili"]

Bu görüntüden başlatılan kapsayıcılar, demo-user olarak çalışacaktır. Kullanıcı, demo-group grubunun bir üyesi olacaktır. Kullanıcının bir grupta olmasına ihtiyacınız yoksa grup adını atlayabilirsiniz:

 KULLANICI demo kullanıcısı

Adlar yerine bir kullanıcı kimliği (UID) ve grup kimliği (GID) belirtebilirsiniz:

 KULLANICI 950:950

Bilinen bir UID ve GID tahsis etmek genellikle ilerlemenin en güvenli yoludur. Kapsayıcıdaki kullanıcının aşırı ayrıcalıklı bir ana bilgisayar hesabıyla eşlenmesini önler.

USER genellikle bir Dockerfile'de sondan bir önceki aşama olarak belirtilir. Bu, görüntü oluşturmada daha önce kök gerektiren işlemleri çalıştırmaya devam edebileceğiniz anlamına gelir. Yukarıdaki örnekteki apt install talimatının root için meşru bir ihtiyacı vardır. USER komutu üzerine yerleştirilmiş olsaydı, apt gerekli izinlere sahip olmayan demo-user olarak çalıştırılırdı. Dockerfile yönergeleri yalnızca görüntü derlemeleri için geçerli olduğundan, kapsayıcıları çalıştırmadığından, kullanıcıyı değiştirmeyi Dockerfile'nizde daha sonraya bırakmak güvenlidir.

Kapsayıcınızın çalıştığı kullanıcıyı değiştirmek, eriştiği dosya ve klasörlerdeki izinleri güncellemenizi gerektirebilir. Sahipliği, uygulamanız tarafından kullanılacak tüm yollarda ayarlayın:

 KOPYALA initial-config.yaml /data/config.yaml

KULLANICI demo kullanıcısı:demo grubu
RUN chown demo kullanıcısı:demo grubu /veri

Bu örnekte, uygulamanın yapılandırma dosyasında değişiklik yapabilmesi için /data dizininin demo-user ait olması gerekir. Daha önceki COPY ifadesi, dosyayı kök olarak kopyalamış olacaktır. --chown bayrağını copy ile kullanarak bir steno kullanılabilir:

 COPY --chown=demo-user:demo-group initial-config.yaml /data/config.yaml

Bir Konteyner Başlatırken Kullanıcıyı Değiştirme

Kullanıcıyı kendi Dockerfiles'inizde kolayca değiştirebilseniz de, birçok üçüncü parti uygulama root olarak çalışmaya devam ediyor. Docker run'ı her çağırdığınızda --user bayrağını ayarlayarak bunları kullanmayla ilişkili docker run azaltabilirsiniz . Bu, görüntünün Dockerfile'sindeki kullanıcı ayarını geçersiz kılar.

 $ docker run -d --user demo-user:demo-group demo-image:en son
$ docker run -d --user demo-user demo-image:en son
$ docker run -d --user 950:950 demo-image:en son

--user bayrağı, kapsayıcının sürecini belirtilen kullanıcı olarak çalıştırır. Her docker run komutuna ayrı ayrı uygulamanız gerektiğinden, Dockerfile USER talimatından daha az güvenlidir. Düzenli olarak kullanılan resimler için daha iyi bir seçenek, yeni bir kullanıcı hesabı oluşturabilen kendi türev resminizi oluşturmaktır:

 Kök olarak çalışan görüntüden:en son
KULLANICI demo kullanıcısı
 $ liman işçisi inşa . -t-şimdi-kök-olmayan-çalışan-görüntü:en son

Üçüncü taraf bir görüntünün kullanıcısını değiştirmek sorunlara neden olabilir: kap, kök olarak çalıştırılmasını bekliyorsa veya köke ait dosya sistemi yollarına erişmesi gerekiyorsa, uygulamayı kullanırken hatalar görürsünüz. Sorunlara neden olan yollardaki izinleri manuel olarak değiştirmeyi deneyebilirsiniz. Alternatif olarak, satıcının uygulamayı ayrıcalıklı olmayan bir kullanıcı hesabıyla çalıştırmak için desteklenen bir yöntemi olup olmadığını kontrol edin.

Kök Olarak Çalıştırılması Gereken Uygulamaları İşleme

Kullanıcı ad alanı, bazı kök ayrıcalıklarına ihtiyaç duyan uygulamalarla ilgilenmek için bir tekniktir. Bir kapsayıcının içindeki kökü, ana makinenizdeki kök olmayan bir kullanıcıyla eşleştirmenize olanak tanır. Kapsayıcının içindeki simüle edilmiş kök, ihtiyaç duyduğu ayrıcalıklara sahiptir, ancak bir ara, ana bilgisayara kök erişimi sağlamaz.

Ad alanı yeniden eşleme, /etc/docker/daemon.json dosyanıza bir userns-remap alanı eklenerek etkinleştirilir:

 {
    "userns-remap": "varsayılan"
}

userns-remap için default değerin kullanılması, Docker'a ana makinenizde dockremap adlı yeni bir kullanıcıyı otomatik olarak oluşturmasını söyler. Kapsayıcılardaki kök, ana makinenizdeki dockremap geri eşlenir. Bunun yerine isteğe bağlı olarak bir UID/GID veya kullanıcı adı/grup adı kombinasyonu kullanarak mevcut bir kullanıcıyı ve grubu belirtebilirsiniz:

 {
    "userns-remap": "demo kullanıcısı"
}

Değişikliğinizi uyguladıktan sonra Docker arka plan programını yeniden başlatın:

 $ sudo hizmeti liman işçisi yeniden başlatılıyor

nsuser-remap: default kullanıyorsanız, dockremap kullanıcısı artık ana makinenizde bulunmalıdır:

 $ kimlik yerleştirme haritası

uid=140(dockremap) gid=119(dockremap) grupları=119(dockremap)

Kullanıcı ayrıca /etc/subuid ve /etc/subgid alt kimlik dosyalarında da görünmelidir:

 $ dockremap:231500:65535

Kullanıcıya, 231500'den başlayarak 65.535 alt kimlik aralığı atanmıştır. Kullanıcı ad alanı içinde, kimlik 231500 0 ile eşleştirilir ve bu, onu kapsayıcılarınızda kök kullanıcı yapar. Yüksek numaralı bir UID olan 231500'ün ana bilgisayar üzerinde hiçbir ayrıcalığı yoktur, bu nedenle kapsayıcı koparma saldırıları çok fazla hasar veremez.

Başlattığınız tüm kaplar, docker run --userns=host ile devre dışı bırakmadığınız sürece, yeniden eşlenen kullanıcı ad alanını kullanarak çalışır. Mekanizma, /var/lib/docker içinde ad alanlı kullanıcının alt UID'sine ve GID'sine ait olan ad alanlı dizinler oluşturarak çalışır:

 $ sudo ls -l /var/lib/docker/231500.231500

toplam 14
drwx------ 5 231500 231500 13 Tem 22 19:00 aufs
drwx------ 3 231500 231500 13 Tem 22 19:00 konteynerler
...

Kullanıcı ad alanı, kapsayıcı yalıtımını artırmanın, kesintileri önlemenin ve kök ayrıcalıklarına ihtiyaç duyan uygulamalarla uyumluluğu korumanın etkili bir yoludur. Yine de bazı ödünleşimler var: Bu özellik en iyi şekilde yeni bir Docker örneğinde çalışır, ana bilgisayardan monte edilen birimlerin izinlerinin ayarlanması gerekir ve bazı harici depolama sürücüleri kullanıcı eşlemesini hiç desteklemez. Bu seçeneği benimsemeden önce belgeleri gözden geçirmelisiniz.

Özet

Kapsayıcılı uygulamaları kök olarak çalıştırmak bir güvenlik riskidir. Göz ardı edilmesi kolay olsa da, kapsayıcıların sağladığı yalıtım, çekirdek kullanıcılarını kapsayıcı kullanıcılarından tamamen ayıracak kadar güçlü değildir. Kapsayıcıdaki kök, ana makinenizdeki kök ile aynıdır, bu nedenle başarılı bir uzlaşma, makinenizin kontrolünü sağlayabilir.

Bir resim yazarı olarak, uygulamanızın root olmadan çalışması için USER talimatını Dockerfile dosyanıza eklemelisiniz. Görüntü kullanıcıları, belirli bir UID ve GID atamak için docker run --user ile bunu geçersiz kılabilir. Bu, görüntünün normalde kök kullandığı durumları azaltmaya yardımcı olur.

--cap-drop=ALL kullanarak kapsayıcıdaki tüm yetenekleri bırakarak ve ardından --cap-add bayraklarıyla gerekli olanları beyaz listeye alarak güvenliği daha da sıkılaştırabilirsiniz. Bu teknikleri birleştirmek, uygulamanızı ihtiyaç duyduğu minimum ayrıcalıklar kümesiyle root olmayan bir kullanıcı olarak çalıştıracak ve güvenlik duruşunuzu iyileştirecektir.