Docker Dosyaları ve Birimleri: İzin Reddedildi

In: Genel


Docker görüntüsüne kopyalanan bir dosyada veya bir Docker kapsayıcısında takılı bir birimdeki bir dosyaya erişirken ‘İzin Reddedildi’ hatasıyla mı karşılaştınız? Bu blogda, neden ‘İzin Reddedildi’ hatası aldığınızı ve nasıl çözüleceğini öğreneceksiniz. Zevk almak!

1. Giriş

içine dalmadan önce İzin reddedildi Docker kapsayıcılarında sorun varsa, izinlerin Linux’ta nasıl işlediğine dair temel bir bilgiye sahip olmak iyidir. Bu kavramlara zaten aşina iseniz, bu paragrafı atlayabilirsiniz.

İzinlerle tanışmak için iyi bir başlangıç ​​noktası şu adreste bulunabilir: Ubuntu belgeleri ve bu mükemmel açıklama hakkında umask. Kısa bir özet istiyorsanız, okumaya devam edin!

Yeni bir dizin oluşturduğunuzda blog ve bu dizinin özelliklerini listeleyin, bir terminal penceresinde aşağıdaki çıktıyı göreceksiniz:

$ mkdir blog
$ ls -la
drwxrwxr-x  2 user group 4096 Aug 14 06:15 blog/

Burada soldan sağa sıralanan bazı maddeleri inceleyelim:

d Bunun bir dizin olduğunu gösterir.
rwx Sahibinin izinleri. Bu durumda mal sahibi ryemek wayin ve execute izinleri.
rwx Grubun izinleri. Bir kullanıcı bir veya daha fazla gruba aittir. Bu durumda, izinler sahiple aynıdır.
rx Diğerinin izinleri. Grubun sahibi olmayan veya gruba ait olmayan herkes bu durumda okuma ve yürütme izinlerine sahip olacaktır.
kullanıcı Dizin bu kullanıcıya aittir. Başlık altında, bu mantıksal ad bir kullanıcı kimliğine (uid) eşlenir. Yalnızca bir kullanıcınız olduğunda, bu muhtemelen uid 1000 olacaktır.
grup Dizin bu gruba aittir. Başlık altında, bu mantıksal ad bir grup kimliğine (gid) eşlenir. Gidişiniz muhtemelen gid 1000 olacaktır.

Yeni bir dosya oluşturduğunuzda defaultpermissions.txt ve dosyanın özelliklerini listeleyin, benzer bir çıktı göreceksiniz:

$ touch defaultfilepermissions.txt
$ ls -la
-rw-rw-r-- 1 user group    0 Aug 14 06:20 defaultfilepermissions.txt

İzinler, dizine benzer şekilde listelenir. yok d ilk öğe olarak, çünkü elbette bir dizin değildir ve dosyanın herhangi bir yürütme izni yoktur.

2. Önkoşullar

Aşağıdaki paragraflarda yürütülen testler, tarafından sağlanan Ubuntu 22.04 tabanlı bir VirtualBox Sanal Makinesi (VM) içinden yürütülür. osboxes.org. Bu, bir belgenin 2. paragrafındaki talimatları izlerseniz kolayca kurulabilir. önceki yazı.

VM’de oturum açıldıktan sonra docker’ın yüklenmesi gerekir. Yazma sırasında Docker v20.10.14 kullanılır.

$ sudo snap install docker

Testleri kendi yerel Ubuntu kurulumunuzdan da yürütebilirsiniz, testleri yürütmek için sistem ayarlarınızda herhangi bir değişiklik yapılması gerekmez.

OSBoxes VM’yi kullanırken, kullanıcı/grup osbox’lar/osbox’lar olacaktır. Kendi sisteminizi kullanıyorsanız, kullanıcı/grup, users ve groups emretmek.

Aşağıdaki paragraflarda kullanılan dosyalar şu adreste mevcuttur: GitHub.

3. Kök Olarak Çalışan Konteyner

Bu ilk testte, yerel dosya sisteminden Docker görüntüsüne bir dosya kopyalanacaktır. Docker görüntüsü için temel görüntü, Alpine Linux görüntüsüdür.

Bir dizin oluşturun 1-defaultcontainerdizine gidin ve bir test.txt bazı kukla içerikli dosya. Oluşturmak Dockerfile aşağıdaki içeriklerle aynı dizinde:

FROM alpine:3.16.2
 
COPY test.txt /tmp/test.txt

bu FROM talimat, Alpine Linux 3.16.2 temel Docker görüntüsünü ve COPY talimat yerel kopyalayacaktır test.txt konumunda Docker görüntüsüne dosya /tmp/test.txt.

Bir terminal penceresinden Docker görüntüsünü oluşturun:

$ sudo docker build -f Dockerfile -t dockertest .
[sudo] password for osboxes: 
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM alpine:3.16.2
3.16.2: Pulling from library/alpine
213ec9aee27d: Pull complete 
Digest: sha256:bc41182d7ef5ffc53a40b044e725193bc10142a1243f395ee852a8d9730fc2ad
Status: Downloaded newer image for alpine:3.16.2
 ---> 9c6f07244728
Step 2/2 : COPY test.txt /tmp/test.txt
 ---> 842ef14a6a73
Successfully built 842ef14a6a73
Successfully tagged dockertest:latest

Kabuğu kullanabilmek için Docker kapsayıcısını etkileşimli modla başlatın:

$ sudo docker run --rm -it dockertest /bin/sh

Dizine git /tmp ve dosyaları listeleyin:

# ls -la
-rw-rw-r--    1 root     root            23 Aug 14 10:33 test.txt

Dosya izinlerinin korunduğuna, ancak kullanıcı/grubun root/root olduğuna dikkat edin. Varsayılan olarak, bir Docker kapsayıcısı, bir güvenlik sorunu olan kök kullanıcı olarak çalışır.

yürütmeyi dene cat test.txt ve dosyanın içeriğinin çıktısını göreceksiniz. ile dosyayı düzenlemeyi deneyin. vi ve dosyayı kaydedin. Bu eyleme de izin verilir. Bu sonuçlar mantıklıdır: root kullanıcısı bunları yürütür ve root her şeyi yapabilir.

Yazarak kabuktan çıkın exit.

Testlerin birbirinden bağımsız yürütülmesini sağlamak için Docker imajını aşağıdaki gibi kaldırın:

$ sudo docker rmi dockertest

4. Kullanıcı 1000 Olarak Çalışan Konteyner

Bu test, Docker kapsayıcısı için bir kullanıcı oluşturmanız dışında birincisine benzer. Bu şekilde, kapsayıcı, bir kapsayıcıyı çalıştırmanın daha güvenli bir yolu olan kök kullanıcı olarak artık çalışmayacaktır.

Bir dizin oluşturun 2-containeruser1000dizine gidin ve bir test.txt bazı kukla içerikli dosya. Oluşturmak Dockerfile aşağıdaki içeriklerle aynı dizinde:

FROM alpine:3.16.2
 
RUN addgroup --g 1000 groupcontainer
RUN adduser -u 1000 -G groupcontainer -h /home/containeruser -D containeruser
 
USER containeruser
 
COPY test.txt /home/containeruser/test.txt

Ne oluyor bu yeni Dockerfile?

  • İle birlikte RUN addgroupbir grup groupcontainer gid 1000 ile oluşturulur;
  • İle birlikte RUN adduserBir kullanıcı containeruser gruba ait uid 1000 ile oluşturulur groupcontainer ve ev dizini /home/containeruser;
  • İle birlikte USER containeruserkapsayıcı kullanıcıyla birlikte çalışır containeruser;
  • Bölge test.txt dosya ana dizine kopyalanır containeruser.

Bu Dockerfile katman sayısını azaltmak için daha verimli hale getirilebilir. Katmanlar hakkında daha fazla bilgi için, bir önceki yazı bu konu hakkında. Basitlik adına, burada Docker görüntüsünün optimize edilmesi düşünülmemiştir.

Kapsayıcıyı daha önce yaptığınız gibi oluşturun ve çalıştırın. İlk önce hangi kullanıcının kapsayıcıyı çalıştırdığını kontrol edin:

Beklendiği gibi, kapsayıcı kullanıcı olarak çalışır containeruser. Ana dizine gidin containeruser ve dosyaları listeleyin:

# ls -la
-rw-rw-r--    1 root     root            23 Aug 14 10:58 test.txt

Bu sizi şaşırtabilir, ancak dosyanın sahibi hala root/root’tur.

yürütmeyi dene cat test.txt ve dosyanın içeriğinin çıktısını göreceksiniz. Bu yapılabilir çünkü other okuma izinleri var. Unutmayın, kapsayıcı kullanıcı olarak çalışır containeruser şimdi. ile dosyayı düzenlemeyi deneyin. vi ve dosyayı kaydedin. Bu mümkün değil: dosyanın salt okunur olduğuna dair bir uyarı verilir. Çünkü bu other yazma izinleri yok.

Hala ikna olmadıysanız, aynı testi uid/gid 1024 ile yapın. Sonuçlar aynıdır. Dosyalar dizindeki depoda bulunur 3-containeruser1024. Karşılık gelen altında Dockerfile:

FROM alpine:3.16.2
 
RUN addgroup --g 1024 groupcontainer
RUN adduser -u 1024 -G groupcontainer -h /home/containeruser -D containeruser
 
USER containeruser
 
COPY test.txt /home/containeruser/test.txt

Docker görüntüsünü kaldırın.

5. Konteyner Kullanıcı 1024 Olarak Çalışıyor ve Sahipliği Değiştirildi

Bu paragrafta izin sorununu çözeceksiniz. İşin püf noktası, dosyanın sahipliğini Docker kapsayıcısını çalıştıran kullanıcıya değiştirmektir. Bir dizin oluşturun 4-containeruser1024changedowner. bu Dockerfile dır-dir:

FROM alpine:3.16.2
 
RUN addgroup --g 1024 groupcontainer
RUN adduser -u 1024 -G groupcontainer -h /home/containeruser -D containeruser
 
USER containeruser
 
COPY --chown=containeruser:groupcontainer test.txt /home/containeruser/test.txt

içeren satırda COPYmülkiyeti test.txt dosya kullanıcı olarak değiştirildi containeruser ve grup groupcontainer.

Kapsayıcıyı daha önce yaptığınız gibi oluşturun ve çalıştırın. Kullanıcının ana dizinine gidin containeruser ve dosyaları listeleyin:

# ls -la
-rw-rw-r--    1 containe groupcon        23 Aug 14 10:58 test.txt

yürütmeyi dene cat test.txt ve dosyanın içeriğinin çıktısını göreceksiniz. ile dosyayı düzenlemeyi deneyin. vi ve dosyayı kaydedin. Buna izin verilir, çünkü bu sefer, containeruser dosyanın sahibidir ve uygun yazma izinlerine sahiptir.

Docker görüntüsünü kaldırın.

6. Hacim Eşlemeleri

Hacim eşlemeleriyle, yerel bir dizini Docker kapsayıcısının içindeki bir dizine eşleyeceksiniz. Bu daha zor olabilir, çünkü yerel sistem izinleri, kullanıcılar, gruplar vb. hakkında bazı varsayımlarda bulunmanız gerekir. Ve genellikle bu sadece iyi çalışır çünkü yerel kullanıcı kimliğiniz/gidiniz muhtemelen 1000/1000’dir ve kapsayıcının içinde bu benzer olacaktır. Hacim eşlemelerinde, sahibin uid/gid’inin kapsayıcının dışında ve içinde aynı olması önemlidir. Bunun nasıl çalıştığını görelim!

Bir dizin oluşturun 5-volumemapping ve bir dizin oluşturun testdir ve bir test.txt bu dizinde bazı sahte içerikler içeren dosya.

Yerel kullanıcınızın kullanıcı kimliğini/gidini kontrol edin:

$ id -u osboxes
1000
$ id -g osboxes
1000

Dizinin izinleri şunlardır:

$ ll
drwxrwxr-x 2 osboxes osboxes 4096 Aug 14 04:19 testdir/

Dosyanın izinleri şunlardır:

$ ll
-rw-rw-r-- 1 osboxes osboxes   23 Aug 14 06:58 test.txt

Bu sefer, aşağıdakileri kullanırsın Dockerfile:

FROM alpine:3.16.2
 
RUN addgroup --g 1024 groupcontainer
RUN adduser -u 1024 -G groupcontainer -h /home/containeruser -D containeruser
 
USER containeruser
 
RUN mkdir /home/containeruser/testdir

Test için yerel kullanıcınızın uid/gid’inin ve kap içindeki kullanıcının farklı olmasının önemli olduğuna dikkat edin. Dosyayı bu sefer konteynere kopyalamazsınız, ancak RUN mkdiryerel birimin eşlenebileceği bir dizinin var olduğundan emin olursunuz.

Docker görüntüsünü daha önce olduğu gibi oluşturun ve kapsayıcıyı dizinden çalıştırın 5-volumemapping aşağıdaki gibi. bu -v parametre yereli monte edecek testdir dizine testdir kullanıcının ana dizinine dizin containeruser.

$ sudo docker run -v $(pwd)/testdir:/home/containeruser/testdir --rm -it dockertest /bin/sh

Dizine git /home/containeruser ve içeriğini listeleyin:

# ls -la
drwxrwxr-x    2 1000     1000          4096 Aug 14 10:23 testdir

Gördüğünüz gibi, uid/gid, dizini oluşturan yerel sistem kullanıcısının uid/gid’i olan 1000/1000 değerlerine sahiptir.

Dizine git testdir ve içeriğini listeleyin:

# ls -la
-rw-rw-r--    1 1000     1000            23 Aug 14 10:23 test.txt

Yine, dosya için dizinle aynı sahiplik olduğunu fark edersiniz.

Dosyanın içeriğini okumaya çalışın test.txt, bu başarılı. Yeni bir dosya oluşturmayı deneyin test2.txtbu bir döndürür İzin reddedildi hata çünkü other bu dizinde yazma izni yok.

# cat test.txt
this is a test message
# touch test2.txt
touch: test2.txt: Permission denied

Bunun nasıl çözüleceği, mükemmel bir şekilde açıklanmıştır Bu Blog.

1024 grubunun yerel sistemde sahiplik sahibi olması için dizinin sahipliğini değiştirin.

$ sudo chown :1024 testdir/

Yeni dosyaların grup sahipliğini aldığından emin olun.

Dizin kabının içinden dizin izinlerini kontrol edin testdir:

# ls -la
drwxrwxr-x    2 1000     groupcon      4096 Aug 12 10:23 testdir

Şimdi fark edersiniz ki grup groupcontainer bu dizinin sahibi var.

Dizine git testdirbir dosya oluşturun, ile düzenleyin vi ve içeriğin çıktısını alın. Bütün bunlar artık mümkün.

# touch test2.txt
# vi test2.txt
# cat test2.txt 
another test message

Dosyaların izinlerini kontrol edin.

# ls -la
-rw-rw-r--    1 1000     1000            23 Aug 14 10:23 test.txt
-rw-r--r--    1 containe groupcon         0 Aug 14 10:37 test2.txt

Dosya test.txt hala uid/gid 1000/1000 için orijinal sahipliğine sahip, yeni test2.txt dosyanın containeruser/groupcontainer için sahipliği var.

Yerel sistemden içeriklerini okumak mümkün olacaktır. test2.txtancak salt okunur izinler nedeniyle içeriğini değiştirmesine izin verilmeyecektir. other. Kullanım durumunuza bağlı olarak, bahsedilen blog gönderisinde açıklandığı gibi bunun nasıl çözüleceğine dair çeşitli çözümler mevcuttur.

Docker görüntüsünü kaldırın.

7. Karar

İzin reddedildi Dosyaları Docker görüntülerine kopyalarken oluşan hatalar, Dockerfile. Sadece bu blogda açıklanan sağlanan çözümü izleyin. İzin reddedildi yerel bir dizin ile kap içindeki bir dizin arasındaki hacim eşlemeleriyle ilgili hatalar biraz daha zor olabilir. Umarım, bu blogda verilen bilgiler sorunu anlamanıza ve çözmenize yardımcı olur. İzin reddedildi hatalar.

Bir cevap yazın

Ready to Grow Your Business?

We Serve our Clients’ Best Interests with the Best Marketing Solutions. Find out More

How Can We Help You?

Need to bounce off ideas for an upcoming project or digital campaign? Looking to transform your business with the implementation of full potential digital marketing?

For any career inquiries, please visit our careers page here.
[contact-form-7 404 "Bulunamadı"]