UNİX Dosya İzinleri
Unix’teki izinler sistemi , Linux (veya gerçekten de Unix’in diğer türevleri) ile çalışacaksanız anlamanız gereken şeylerden biridir . Çevrimiçi dosya izinleri hakkında zaten birçok harika makale var; Ancak, bu bana sorulan bir konu, bu yüzden kendi yolumda yazacağım. Unix’te dosya izinlerinin nasıl çalıştığını anlamakta zorlanıyorsanız, umarım bu yazı işinize yarar.
Temel anlayış:
Özünde, dosya izinlerine sahip olmanın ardındaki amaç, bir dosyaya veya dizine erişimi sınırlamaktır – bu, tüm işletim sistemleri için geçerlidir. Unix‘te üç temel izin türü vardır: okuma , yazma ve yürütme . Bunlar tam olarak göründükleri gibidir: Bir dosyayı okuma izniniz varsa, onu açabilirsiniz; bir dosyaya yazma izniniz varsa, onu düzenleyebilirsiniz; ve bir dosyayı yürütme izniniz varsa, onu bir program olarak çalıştırabilirsiniz (bu, açıkçası, yalnızca dosya gerçekten bir program ise çalışır ) . İzinler karıştırılabilir ve eşleştirilebilir, bu nedenle belirli bir dosyayı okuma ve yürütme izniniz olabilir, ancak dosyaya yazamazsınız.
Bu izinleri şu şekilde biçimlendiriyoruz: rwx
sırasıyla okuma, yazma ve yürütme için.
Dosyaya yazma iznini kaçırmış olsaydık, şöyle görünürdü: for write yerine bir tire ile . Benzer şekilde, dosyayı yalnızca yürütebilirsek (ancak okuyamaz veya yazamazsak), o zaman şöyle görünür: .r-x
w
--x
Hepsi iyi ve güzel, ancak farklı kullanıcı türlerini nasıl ayırırsınız? Örneğin, birisiyle paylaşmak istediğiniz bir dosyanız olduğunu, ancak bu dosyaya yazabilmelerini istemediğinizi varsayalım. Yine de kendiniz düzenleyebilmeniz gerekiyor, ancak herkesin değişiklik yapabilmesini istemiyorsunuz !
Bunun için Unix bize üç sınıf izin verir: sahip , grup ve dünya . Bir kez daha, bunlar tam olarak göründükleri gibidir. Her dosya için, dosyanın sahibi olan kişi , dosyanın sahibi olan grup ve diğer herkes için ayrı bir dizi izin vardır . Bu izinler birbiri ardına zincirlenir, böylece sahibin üç iznine sahip olursunuz, hemen ardından grubun üç iznine ve dünyanın üç iznine sahip olursunuz.
Sonunda şuna benziyor: rwxrwxrwx
. rwx
Dosyanın sahibi, dosyanın sahibi olan grup ve diğer herkes için tüm izinlere ( ) sahipsiniz .
Örneği daha önce ele alalım. Okumanız ve düzenlemeniz gereken bir dosyanız var, ancak başka kimsenin onu düzenlemesini istemiyorsunuz. İzinleri şöyle bir şey olacak şekilde değiştirebilirsiniz:
rw-r--r--
Burada, sahibi okuyabilir ve yazabilir, grup okuyabilir ve diğer herkes (yani dünya ) da okuyabilir.
Başka bir örnek alalım. Kimsenin düzenlemesini istemediğiniz gerçekten önemli bir belgeniz var . Kendiniz okuyabilmek istiyorsunuz, ancak onu herkesten tamamen gizli tutmak istiyorsunuz. Tamamen güvende olmak için kendi yazma izninizi kaldırmak isteyebilirsiniz . Tam izinler şöyle görünür:
r--------
Bu neredeyse tamamen kilitlendi. Sahibi okuyabilir (ve başka hiçbir şey yapamaz); diğer herkes dosyanın var olduğunu görebilir, ancak onunla hiçbir şekilde etkileşime giremez.
Bu şekilde, tek tek dosyalara (veya tüm dizin ağaçlarına) kimlerin erişmesine izin verildiğini belirleyebilirsiniz. Bunu daha sonra biraz daha derinlemesine öğreneceğiz, ancak şimdilik dosya izinlerini belirlemenin alternatif yoluna bir göz atalım.
Sekizli Format:
Sekizli belirtim formatı rwx
, sembolik formatla (önceki bölümde incelediğimiz) aynı prensipte çalışır. Şahsen bu yöntemi çok daha temiz buluyorum, ancak hangi sürümü tercih ettiğiniz açıkçası bireysel bir tercih.
Sekizli formatta, izinlerin her birine bir değer atanır:
r = 4
w = 2
x = 1
rwx
421
Bir izin belirtmek için bu sayıları toplarız; öyle rwx
olurdu ve olurdu .4 + 2 + 1 = 7
r-x
4 + 1 = 5
Bunu akılda tutarak, birlikte zincirlediğimiz üç set okuma, yazma ve yürütme izinleri olarak ele alarak kullanıcı, grup ve dünya izinlerini öncekiyle tamamen aynı şekilde biçimlendirebiliriz.
İlk örneğimize geri dönelim. Okumanız ve yazmanız gereken bir dosyanız var, ancak başka birinin ona yazmasını engellemek istiyorsunuz. Sembolik biçimde bu olurdu . Sekizli formatta, üç “blok” un her birini sekizlik eşdeğerine dönüştürürdük, böylece bize ( , ) izni verirdik.rw-r--r--
644
rw = 4 + 2 = 6
r = 4
rw- r-- r--
420 400 400
644
Bir yeni örnek daha deneyelim. Tam erişim istediğiniz bir dosyanız var. Grubun erişiminin olmamasını, ancak diğer herkesin bu dosyayı okuyup yazabilmesini istiyorsunuz. Bunun sembolik cevapta nasıl görüneceğini çözebilecek misin bir bak. Cevap aşağıda (görüntülemek için tıklayın):
rwx---rw-
Bunun sekizli formatta nasıl görüneceğini düşünelim.
Üç izin grubumuz var:
Owner: rwx
Group: ---
World: rw-
Sahibinden başlayalım. Her üç izin de etkinleştirildi, yani elimizde 4, 2 ve 1 var. Bunları bir araya toplayınca 7 elde ediyoruz.
Grup izinleri kolaydır – hiçbiri yoktur, bu nedenle yalnızca 0’dır.
Diğer herkes okuyabilir ve yazabilir, yani elimizde 4 ve 2 var. Bunları toplayınca altı tane elde ederiz.
Dolayısıyla sembolik biçimde sekizli biçime çevrilir .rwx---rw-
706
Özel Uçlar:
Artık temel Unix dosya izinlerinin nasıl çalıştığını iyi anlamalısınız. Şimdi biraz daha gelişmiş bir şeye bakalım.
Okuma, yazma ve yürütme hakkında bilgi sahibiyiz – ancak bazı durumlarda, bunların kapsamadığı özel izinlere ihtiyacımız var.
Örneğin, bir dosyayı yönetici kullanıcı (kök) olarak çalıştırmanız gerektiğinde ne olur? Bunun iyi bir örneği passwd
Linux’taki komuttur. Düşük ayrıcalıklı bir kullanıcı olarak, şifreleri içeren sistem dosyalarına erişim izniniz yok, ancak yine de passwd
komutla şifrenizi değiştirebilirsiniz, peki bu nasıl oluyor?
Cevap, “SUID” biti denen bir şeydir.
SUİD:
Şimdiye kadar okuma ( r
), yazma ( w
) ve yürütme ( x
) bitlerini gördük. s
Şimdi SUID ( ) bitini görüyoruz . Bu bit ayarlandığında, aşağıdaki x
gibi sahip izinlerinin yerini alır: . SUID bitinin yaptığı, dosyanın dosyanın sahibi olarak yürütülmesine izin vermektir, yani başka bir deyişle, komut root’a aitse, çalıştırdığınızda kök (yani admin) izinlerini kullanacaksınız. Bu , manuel olarak düzenleme izniniz olmadan sistem parola dosyasını düzenlemek için kullanabileceğiniz anlamına gelir !rws------
passwd
Bunu pratikte burada görebilirsiniz:
passwd
Komutun root’a (yani yöneticiye) ait olduğuna dikkat edin . Kendi kullanıcımız ( ) olarak okuma ve yürütme izinlerimiz var – SUID bitini kullanmak için bunlara ihtiyacımız var. Ek olarak, komutu sahip olarak yürütmemize izin veren SUID bit setine ( ) sahibiz – bu durumda kök – böylece bize geçici olarak yöneticinin izinlerini verir.r-x
rws
SGID:
SGID biti, SUID bitiyle neredeyse aynı şekilde çalışır; ancak size dosyanın sahibi olan kullanıcının izinlerini vermek yerine dosyanın sahibi olan grubun izinlerini verir . Bir sonraki bölümde grupları ayrıntılı olarak tartışacağız , ancak şimdilik anlamanız gereken tek şey, SUID’nin bir dosyanın sahibi için yaptığını SGID’nin gruplar için yaptığıdır. Söz konusu programı, dosyanın sahibi olan grubun bir üyesiymişsiniz gibi aynı izinlerle çalıştırmanıza olanak tanır.
Buna iyi bir örnek, wall
oturum açmış tüm kullanıcılara mesaj göndermenizi sağlayan komuttur:
Bu durumda ( s
) bitinin ikinci izin bloğunda olduğuna ve bunun bir SUID biti yerine bir SGID olduğuna dikkat edin. Komut, kullanıcı köküne aittir, ancak aynı zamanda gruba da aittir tty
, bu nedenle wall
komutu yürüttüğünüzde, grubun üyesi olan bir kullanıcıyla aynı izinlerle yürütürsünüz tty
.
Yapışkan Bit:
Bakacağımız son özel izin, yapışkan kısımdır. SUID ve SGID, tek bir programı yürütürken geçici olarak daha fazla izin almanıza izin verirken, yapışkan bit bir koruma mekanizması görevi görür. Yapışkan bitin etkinleştirildiği bir dosya, yalnızca sahibi veya kök kullanıcı tarafından yeniden adlandırılabilir veya silinebilir. Diğer tüm açılardan normal izinler geçerlidir; yani dosya dünya çapında okunabilir ve dünya çapında yazılabilir ( ) ise, herhangi bir kullanıcı dosyayı okuyabilir veya yazabilir – dosyayı silemez veya yeniden adlandıramaz. Yapışkan bitin iyi bir örneği, geçici dosyaları depolamak için kullanılan dizindir. Herhangi bir kullanıcı dizini okuyabilir ve dizine yazabilir, ancak başka bir kullanıcıya ait dosyaları silemez.rw-/tmp/tmp
t
İzin listesinin sonundaki bit’e dikkat edin . Bu, yapışkan bitin aktif olduğunu gösterir. Ayrıca d
izin listesinin başındaki bitin aktif olduğunu göreceksiniz – bu sadece bir dosyaya değil bir dizine baktığımız anlamına gelir.
Sekizli
Şaşırtıcı olmayan bir şekilde, özel bitlerin tümüne sekizli formatta da atıfta bulunulabilir. Bu, üç basamaklı dosya izninin önüne fazladan bir sayı eklenerek yapılır. SUID’yi referans almak için 4 sayısını kullanırız. SGID’yi referans almak için 2 sayısını ve yapışkan biti referans almak için 1 sayısını kullanırız. Daha önce kullandığımız sayılar.
Diğer bir deyişle, tam izinler artı yapışkan bit şöyle görünür: 1777
. Sahibinin okuyabileceği ve yazabileceği ve diğer herkesin okuyabileceği bir dosyaya SUID eklemek şöyle görünür: 4644
. SGID bitini herkes tarafından okunabilen ve hiç kimse tarafından değiştirilemeyen/yürütülmeyen bir dosyaya eklemek şöyle görünür: 2444
.
Diğer sekizli kümelerde olduğu gibi, bunlar birden fazla özel izin eklemek için birlikte eklenebilir. Tam izinlere sahip bir dosyada hem SUID hem de SGID ayarlamak istiyorsanız (örneğin), 6777
. SUID, SGID ve yapışkan biti herkes tarafından okunabilen, ancak hiç kimse tarafından yazılabilir ve yürütülemez bir dosyaya eklemek için 7444
.
Unix Grupları:
Unix’teki dosyaların izinleri hakkında çok konuştuk – umarım artık izin bitlerinin nasıl çalıştığını daha iyi anlamışsınızdır. Çokça bahsettiğim ama henüz ele almadığım bir şey grup izinleri kavramıdır, bu yüzden bu bölümde yaptığımız şey bu.
Unix’teki grupların amacı, daha gelişmiş izinlerin ayarlanmasına izin vermektir. Yeni bir kullanıcı oluşturulduğunda aynı isimde yeni bir grup da oluşturulur. Kullanıcı, birincil grubu haline gelen bu gruba atanır . Bir kullanıcı yalnızca bir birincil gruba ait olabilir – varsayılan olarak bu, onlarla aynı ada sahip bu yeni gruptur. Bu nedenle size daha önce gösterdiğim örneklerdeki dosyaların çoğu hem sahibi hem de grubu olarak root
.
Her kullanıcı yalnızca bir birincil gruba ait olabilir, ancak birçok ikincil gruba ait olabilir. İkincil gruplar, kullanıcıları mantıksal olarak kategorilere ayırmak için kullanılır. Örneğin, developer
herkesin kullanmasını engellemek istediğiniz araçlara erişimi olan bir grup isteyebilirsiniz. Aynı şekilde, bir dosyayı yalnızca belirli kişilerin okuyabileceği şekilde yapmak isteyebilirsiniz. Bunun için, belirtilen kullanıcıları ikincil bir gruba eklersiniz, ardından dosyanın sahipliğini, ikincil grubun grup sahipliğini elinde tutacak şekilde değiştirirsiniz. Bu noktada, grubun tüm üyeleri o dosya üzerinde grup izinlerine sahip olacaktır.
Bu komutla yeni gruplar eklenebilir:
sudo groupadd <group-name>
Kullanıcılar daha sonra gruba şu şekilde eklenebilir:
usermod -aG <group-name> <user-name>
İzinleri Ayarlama:
Doğru, şimdi eğlenceli şeyler için!
Teorik şeyler hakkında çok konuştuk , şimdi dosya izinlerini nasıl ayarlayacağınız hakkında konuşalım .
chmod
İzinler komut kullanılarak ayarlanır . Bunu her iki formatta da yapabiliriz, ancak ben sekizliyi tercih ederim, o yüzden oradan başlayalım. Diyelim ki, sahibi okuyabilir ve yazabilir, grup okuyabilir ve dünyanın hiçbir izninin olmaması için bir dosya ayarlamak istiyoruz. Bunun için sekizlik 640
. Böylece komut şöyle olacaktır:chmod 640 <filename>
Herkese tam izin vermek istediğimizi varsayalım, bunun için sekizlik 777
. Dosyayı şu şekilde düzenlerdik: .chmod 777 <filename>
Sekizliyi anlamak birçok yönden daha zordur, ancak uygulanması daha kolaydır – aynı şeyi sembolik olarak yaptığımızda göreceğiniz gibi.
İlk örneğe geri dönelim. Sahibinin okuyup yazabilmesini istiyoruz, grup okuyabilmeli ve dünya hiçbir şey yapamaz. Sembolik olarak şöyle görünür: .rw-r-----
Bu dosya izinlerini sembolik olarak ayarlamak şöyle görünür:chmod u=rw,g=r <filename>
Diğer örneğimiz için (herkes her şeyi yapabilir), şöyle görünür: ( “diğerleri” anlamına gelir — yani dünya). Özel bitleri tam olarak aynı şekilde belirtebilirsiniz (örn. SUID için: ). Bunu yapmanın uzun yolu budur – lütfen bazı kestirme yöntemleri öğrenmek için sayfaya bakın .chmod u=rwx,g=rwx,o=rwx <filename>
o
chmod u=s <filename>
man
chmod
Bu, ayar izinlerini ele alır, peki ya sadece mevcut izinleri güncellemek istersek?
kullanmak yerine, bir dosyanın izinlerini değiştirmek için veya =
kullanabiliriz . Bunun için bir örnek kullanacağım:+-
rwxrwxrwx
Bu örnekte, tam izinlere ( veya ) sahip bir dosyayla başlıyoruz 777
. İlk önce sahip yazma iznini ( ) kaldırıyoruz . Daha sonra gruptan ( ) tüm izinleri kaldırıyoruz . Son olarak, SUID bitini eklerken, aynı anda dünyadan ( ) yazma ve yürütme izinlerini kaldırırız.u-w
g-rwx
u+s,o-wx
Aynı şeyi sekizli formatta da yapalım:
Bunun izinleri tamamen aynı şekilde değiştirdiğine dikkat edin. İlk değişiklik ( ) sahibinden yazma izinlerini çıkarır. İkinci dönüşüm ( ) gruptan tüm izinleri çıkarır. Son dönüşüm ( ) önce SUID bitini ekler, ardından yazma ve yürütme izinlerini dünyadan çıkarır.-200
-070
+4000,-003
chmod
Komut inanılmaz derecede güçlü . Hassas bir şekilde kullanıldığında , amaçlarınız için ideal izinleri almak için kullanabilirsiniz, yani dosyaları istediğiniz kadar doğrulukla kilitleyebilirsiniz.
Dosya Sahipliğini Değiştirme:
Son olarak, dosyaların sahipliğini değiştirmeye hızlıca bir göz atalım. Daha önce de belirtildiği gibi, tüm dosyaların bir kullanıcı sahibi olduğu kadar bir grup sahibi de vardır . Bunları değiştirme komutuna . Bunu şu şekilde kullanıyoruz:chown
chown <user>:<group> <filename>
Yalnızca kullanıcıyı değiştirmek istiyorsanız, şunları yapabilirsiniz:chown <user> <filename>
Benzer şekilde, sadece grubu değiştirmek istiyorsanız, şunları kullanabilirsiniz:chown :<group> <filename>
(Aynı şeyi yapabilecek başka bir komut daha var: chgrp
; ancak, bir komutu hatırlamanın çok daha kolay olduğunu düşünüyorum)
Test dosyamıza geri dönersek, aşağıdaki örnekte önce sahibini bob
. Daha sonra grubu değiştiriyorum dev
. Son olarak, tam mülkiyeti köke geri aktarıyorum:
Çalışılan Örnek
Artık Unix’te dosya izinleriyle nasıl çalışacağınızı biliyorsunuz. Tamamen yeni bir dosyadan başlayarak ve onu uygun şekilde kilitleyerek, işe yaramış bir örnek yapalım.
Diyelim ki adında bir dosyamız var . Bob ile paylaşmak istiyoruz, ancak sistemdeki başka kimseyle değil. Bob okuyabilmeli, ancak yazamamalıdır. Kök kullanıcı (yani biz) Günlüğü okuyabilmeli ve yazabilmelidir.Diary.txt
Başlayalım!
İlk önce dosyayı oluşturacağız. 644’ün varsayılan izinlerine sahiptir:
Dosyayı oluşturduDiary.txt
r
Bunun dünyaca okunabilir olmasını istemiyoruz, o yüzden biti dünyadan çıkararak başlayalım :
İzinler iyi ayarlanmış görünüyor, ancak Bob’un günlüğü okumasına nasıl izin vereceğiz? Diary adında yeni bir ikincil grup oluşturalım ve ardından buna Bob’u ekleyelim:
Şimdi tek yapmamız gereken, grubun sahipliğini yeni Günlük grubumuza ait olacak şekilde değiştirmek:Diary.txt
Et Viola! Kökün okuyabileceği ve yazabileceği bir günlüğümüz var, Günlük grubunun üyeleri (belirttiğimiz kullanıcı – bob – üyesidir) günlüğü okuyabilir ve dünya tamamen kapatılır.