Hafta 2

Enes Kaya, gnu/linux
Back

Amaç : Kullanıcı-grup yönetimini ve dosya-dizin izinlerini kavratmak.

Yazarlar : boratanrikulu && hasantezcan


Hastane Örneği Üzerinden Açıklanması

Bir hastane düşünün, bu hastanede çalışanların kullanabileceği yalnız bir tane bilgisayar var. Ve hastanemizde çalışan üç ana meslek grubu var. Bunlar; doktorlar, güvenlik görevlileri ve aşçılar.

pwd

Bu çalışanların tek bir bilgisayarı kullanmasının iki farklı seneryosu olabilir.

1 - Üç meslek grubu da aynı bilgisayarı "tek oturum" şeklinde kullanabilir.

Bu durumda doktor, bilgisayarı kullandığı zaman, olması gerektiği gibi hastalarının; raporlarına, filimlerine, ameliyat görüntülerine vb.. bilgilere ulaşabilir. Aynı zamanda diğer meslek grupları ile ortak bir bilgisayar kullandığından; güvenlik kameralarına, o ayın mutfak masraflarına da bakabilir.

Ve bu durum diğer meslek grupları için de geçerlidir. Bir güvenlik görevlisinin ya da aşçının herhangi bir hastanın raporlarına erişebilmesi ne kadar güvenli ve doğurudur?

İşte bu durumun yaşanmaması için, her bir çalışan için ayrı bir kullanıcı oturumu oluştururuz.

2 - Her bir çalışan için ayrı bir oturum açılabilir.

Bu durumda her bir çalışanın kendine ait bir kullanıcısı olacağından bir önceki durumda yaşanan dosya erişim karmaşası bu sefer olmayacaktır. Yani hiçbir aşçı, güvenlik kameralarına erişip bu kayıtlar ile oynayamayacaktır. Her bir kullanıcının yetkileri belirli olacaktır.


Hastane Örneğimizi Uygulayalım

Şimdi gelin bu hastaneye iki tane doktor, iki tane güvenlik görevlisi ve iki tane de aşçı ekleyelim.

GNU/Linux dağıtımlarında, sisteme bir kullanıcı eklemek için adduser komutu kullanılabilir.

	[~$] adduser kullanıcının_adı
tldr useradd
useradd
home

Şuan sistemimize altı adet kullanıcı ekledik.


Eklediğimiz Kullanıcıları Görüntüleyelim

GNU/Linux'da sistemde bulunan kullanıcılar /etc/passwd dosyasında sıralanır. Kullancıların bilgileri bu dosyada saklanır.

Bu dosyayı görüntülemek için;

	[~$] cat /etc/passwd
pwd

Dosya incelendiğinde dev:x:1000:1000:PauSiber Dev,,,:/home/dev:/usr/bin/zsh gibi ifadeler gözükür. Hadi şimdi bu ifadelerin ne anlama geldiğini açıklayalım.

ifadeaçıklama
devkullanıcı adı
xkullancının parolasını temsil eder
1000kullanıcının üyelik numarasıdır (user ID)
1000kullanıcının ait olduğu grubun numarasıdır (group ID)
PauSiber Devkullancı hakkında kayıtlı bilgi
/usr/bin/zshkullanıcının shell dizini

Gruplarımızı Oluşturalım

Peki bu hastanede bir tane mi doktar var ? Tabiki de hayır. Bir meslek grubuna dahil birden fazla çalışan olabilir. Aynı meslek grubunda bulunan çalışanların görev tanımları birbirleri ile örtüşür. Aynı meslek grubunda olanları gruplara toplamamız mantıklı bir hareket olacaktır.

Şuan hastanemizde üç farklı meslek grubuna ait ikişer tane çalışanımız var. Gelin şimdi bu meslek grupları için sistemimizde bunu ifade edecek yeni gruplar oluşturalım.

GNU/Linux dağıtımlarında, sisteme bir grup eklemek için groupadd komutu kullanılabilir.

	[~#] groupadd grubun_ismi
pwd

Sistemimize üç adet yeni grup ekledik. Sistemimizde bulunan gruplar /etc/group dosyasında sıralanır.

Bu dosyayı görüntülemek için;

	[~$] cat /etc/group
pwd

Son görselde de görüldüğü üzere bizim eklediğimiz grupların haricinde, önceden eklediğimiz kullacılar da burada gözükmekte. Örneğin "doktor_beyza" gibi bir grup sistemde çoktandır eklenmiş durumda. Peki bu nasıl oluyor?

GNU/Linux dağıtımlarında, sisteme yeni bir kullanıcı eklediğinizde, sisteme aynı anda bu kullanıcı adında bir de grup ekler.


Çalışanlarımızı Gruplarına Ekleyelim

Evet, şuan hastanemizde altı adet çalışan ve bununla birlikte henüz daha hiçbir personeli dahil etmediğimiz üç tane de meslek grubumuz var. Şimdi çalışanlarımızı ait oldukları meslek gruplarına ekleyelim.

Bunu yapmak için gpasswd komutu kullanılabilir.

	[~#] gpasswd --add kullanıcı_adi grup_adi

Not : Burada --add parametresi oldukça kritiktir. Eğer kullanılmaz ise kullanıcıyı hali hazırda bulunduğu tüm gruplardan çıkarır ve yeni gruba ekler. Fakat bizim istediğimiz bu değil, kullanıcının hali hazırda bulunduğu grupları değiştirmek istemiyoruz, yalnızca yeni bir gruba dahil etmek istiyoruz, bu durumda --add parametresi kullanmamız bir gerekliliktir.

pwd

Ekleme işlemlerimizi yaptık. Şimdi /etc/group' u yeniden görüntüleyelim.

pwd

Başarılı bir şekilde personelimizi gruplarına ekledik.


Hastane Müdürümüz, Nam-ı Değer ROOT !

Şimdi sıra hastanenin müdüründen bahsetmeye geldi. Hastane müdürü hastanedeki en yetkili kişidir. Doktorların, güvenlik görevlilerinin ve aşçının erişebildiği verilerin hepsine erişebilir. Aslında o da bir çalışandır, fakat özel bir çalışandır. Yetkileri onu diğer çalışanlardan ayrıştırır.

GNU/Linux sistemlerde bahsettiğimiz hastane müdrünün karşılığı root kullanıcısıdır. Root kullancısı sistemdeki en yetkili kullancıdır. Sistemdeki tüm dosyalara erişim yetkisi vardır.


Çalışanların Odaları, /home dizinleri

Hastanemizde çalışan tüm personelin kendine ait bir odası vardır. Çalışanlar bu odalarda kendi kişisel eşyalarını saklarlar.

GNU/Linux işletim sistemlerinde sisteme kayıtlı her insan kullancı için /home dizini altında o kullancıya tahsis edilmiş bir alan mevcuttur. Kullanıcılar bu dizinde verilerini diledikleri şekilde depolarlar.

root kullancısının da kendine ait bir odası vardır. Fakat root kullacısına ayrılmış bu alan direkt root dizini altında ayrılmış /root dizinidir.

pwd

Hastanemizden Çalışan Çıkaralım

Hastanemizden, yani sistemimizden bir kullanıcıyı silmek istersek deluser komutunu kullanabiliriz.

	[~#] deluser --remove-home kullancı_adi

Şimdi sistemimizde kayıtlı olan doktor_ahmedi aşağıdaki örnekteki gibi işten çıkaralım.

pwd

Kullancının Parolalarının Değiştirilmesi

Eğer bir kullanıcı parolasını değiştirmek ister ise passwd komutu kullanılabilir.

	[~$] passwd
pwd

Bir Çalışanımızı Grubundan Çıkaralım

Örneğin guvenlık_aykut kullanıcısının artık guvenlik grubunda bulunmasını istemiyorsak gpasswd ile birlikte --delete parametresini kullanarak bu işlemi gerçekleştirebiliriz.

	[~#] gpasswd --delete guvenlik_aykut guvenlikciler
pwd

Kullanıcıyı örnek amacıyla grubundan çıkarmıştık, şimdi geri dahil edelim :).

	[~#] gpasswd --add guvenlik_aykut guvenlikciler

Bir Grubumuzu Silelim

Örneğin sistemimize hemşireler grubunu eklemiş olalım, eğer bu gruba ihtiyacımız artık kalmaz ise grubu silebiliriz. Grubu silmek için groupdel komutu kullanılır.

	[~#] groupdel hemsireler
pwd

Hastane Yönetimi

Hastane örneğimizde hastalar, kameralar ve yemekhane dizinlerimiz olacak. Fakat tahmin edeceğiniz üzere bu dosyalara yalnızca belirli meslek gruplarının ve belirli kullanıcıların yetki sahibi olmasını bekleriz.

Aşağıdaki gibi dizinleri oluşturalım.

pwd

Dizinlerimiz içerisine aşağıdaki gibi gerekli dosyaları da oluşturalım.

Bu dizinlerin sahiplik ve izinlerini ayarlama işlemine geçmeden önce GNU/Linux'da dosya ve dizin kavramlarından bahsetmeliyiz.

pwd

Dosya ve Dizin Kavramları

GNU/Linux'ta her şey birer dosyadır. [1]

Özünde dizinler de dosyaların konumunu belirten birer özel dosyadır. Dizinler veri içeremez, yalnızca konum belirtmek amaçlı kullanılabilirler. Dizinlerin bir türü yoktur, uzantısı yoktur. Dosyaların ise bir türü vardır, uzantısı bulunabilir.

Dizin ve dosya isimleri aynı olamaz.


Dosya ve Dizin İzinlerinin İncelenmesi

ls ile dosyaların izinleri incelenebilir.

	[~$] ls -l fileName

Dosya ve dizin işlemlerine bakıldığında 10 karakterden oluşan bir yapı görünür.

Bu karakterler

izinlerini temsilen kullanılır.

Bunları aşağıdaki gibi üçerli olarak gruplandırarak incelemekte fayda vardır.

Yani bu örnektekinin;

iznine sahip olduğunu görüyoruz. Ayrıca bu dosyaların fsutil kullanıcısına ait olduğunu ve group'unun users olduğunu incelemiş olduk.


Hastane Dosya Sahipliklerinin Değiştirilmesi

Şimdi teorik bilgimizi edikten sonra hastane örneğimize geri dönebiliriz.

Dosyaların sahipliklerini user ve group bazında değiştireceğiz. Bunun için chown komutu kullanabiliriz. Yapısı oldukça basittir.

Genel syntax örnekleri aşağıdaki gibidir.

	[~#] chown yeniSahip dosya_adi
	[~#] chown yeniSahip:yeniGroup dosya_adi
	[~#] chown :yeniGroup dosya_adi

Aşağıdaki gibi 3 dizin için de -R parametresini kullanarak dosyaların group bilgilerini değiştirelim.

Burada -R parametresini kullanma sebebimiz belirttiğimiz işlemi recursive olarak tüm alt(sub) dosya ve dizinlere uygulanması gerektiğini belirtmek içindir.

Tüm hastane dosyalarımızın group sahipliklerini değiştirdik. Fakat dosyaların kullanıcı sahiplikleri halen belirlenmiş değil. Her dosyanın sahibi olarak meslek grubundan belirlenen bir kullanıcıyı atamak istiyoruz. Aşağıdaki gibi adımları gerçekleştirdik.

Dosya sahipliklerini ayarladık.


Hastane Dosya İzinlerinin Değiştirilmesi

Burada kurmak isteğimiz yapı şu şekilde; ilgi dizinler ve dosyalar meslek grubundaki herkes tarafından okunabilir, çalıştırılabilir olmalı; meslek grubundan belirlenen yalnızca bir kişi dosya üzerinde değiştirme yetkisine sahip olmalı.

Bunun için dosyaların izinlerini değiştireceğiz.

Bunun için chmod komutu kullanabilirz. Chmod'un iki tip kullanımı vardır; text method ve numeric method. Text method günlük kullanımda daha çok kullanılır, basit olması açısından. Numeric method daha çok script'lerde kullanılır.

Text Method'un genel kullanım syntax'ı aşağıdaki gibidir.

	[~$] chmod kim=izinYetkisi dosyaAd

Burada kim ifadesi, işlemi hangi kişiler için yapacağını belirtmek için kullanırız.

TextClassAçıklama
uOwnerDosyaya sahip olan kullanıcı
gGroupDosyanın ait olduğu grup
oOtherDiğer herkes
aAllHerkes (ugo ile aynı anlama gelir)

Örnekte = olarak ifade ise verilen işlem ile ne yapılacağını belirtmek amacıyla kullanırız.

OperatorAçıklama
+Yetkiyi ilgili kullanıcılara ekler
-Yetkiyi ilgili kullanıcılardan çıkarır
=Yetkiyi eşitler

İzin yetkisi ise verilecek olan izindir. Yani; r, w, x gibi ifadeler girilir.


Dosyalarımızın İzinlerini Ayarlayalım

Şimdi öğrendiğimiz teorik bilgileri, hastane örneğimiz üzerinde uygulayarak pratiğe dökelim.

İlk olarak tüm dosya group'larından yazma yetkisini çıkaracağız. Bunun için aşağıdaki gibi bir ifade kullanmamız yeterlidir. Aşağıdaki ifade, dosyanın group sahipliğinden yazma [w] yetkisini çıkarmamızı sağlar. Artık group yetkisi kullanılarak dosya üzerinde yazma işlemi yapılamayacaktır.

	[~#] chmod g-w -R dizin/

Ayrıca other'ın dosya üzerinde hiçbir yetkisinin olmasını istemiyoruz. Bunun için de aşağıdaki gibi örneğimizi uygularız. Other'ın sahip olduğu tüm yetkiyi kaldırmış oluruz.

	[~#] chmod o-rwx -R dizin/

Bu işlemi uyguladığımızda klasör'ün içinde neler olduğuna bile bakamayız, çünkü şu ana kadar olan tüm işlemleri PauSiber Dev'in normal kullanıcısı olan dev ile yaptık, dizinler üzerinde dev kullanıcısı other olarak gözükür. dev'in hiçbir yetkisi olmadığı için dizin içlerini göremeyiz.

Dizinlerin içerisini görüntülemek için meslek grubundan bir kullanıcıya geçiş yapabiliriz.

Eğer dosyalar üzerinden yazma işlemi yapmak istersek de meslek grubundan şef olarak seçtiğimiz kullanıcıya geçiş yapmamız gerekir.

Başka bir kullanıcıya geçiş yapmak için su komutunu kullanabiliriz.


Numeric Method ile İzin İşlemlerinin Yapılması

Az önce, text method örneklerimizi yapmadan önce, numeric method da olduğunu söylemiştik. Bu method'u uygulayabilmemiz için bazı bilgilere ihtiyacımız var.

Daha önceden öğrendiğimiz gibi, dosya ve dizinlerin izinleri r, w ve x ile temsil edilir. Her yetkinin numarasal olarak bir karşılığı vardır. Bunlar aşağıdaki gibidir.

İzinNumara Karşılığı
r4
w2
x1

Bir dosyanın yetkisinin numarasal karşılığını göstermek için 3 basamaklı bir sayı kullanırız. Bu 3 basamaklı sayıyı elde etmek için yetkileri üçerli olarak gruplandırıp toplarız.

Kendimiz toplamak yerine, bir dosyanın yetkisinin numarasal karşılığını direkt olarak görmek için stat komutu kullanılabilir.

	[~$] stat -c %a dosyaAdi

Dosyanın izinlerini numeric method ile değiştirmek istiyorsak aşağıdaki gibi bir syntax kullanırız.

	[~$] chmod XXX dosyaAdi

Örneğin hastalar klasörü içerisinde bulunan dosyaların, other'lar tarafından okunabilir ve çalıştırılabilir olmasını istiyor olalım, aşağıdaki gibi yapabiliriz.

Text method kullanacak olsaydık, aynı işlemi yapmak için chmod o=rx * dememiz yeterdi.


Dosya Kilitlemek

Bir dosyayı üzerinde izni verilmiş olsa bile kilitlemek, yani değişiklik yapılmaz olsun istiyorsak chattr komutu kullanabiliriz. Kullanımı oldukça basittir.

Kilitlemek için :

	[~$] chattr +i dosyaAdi

Kilidi açmak için :

	[~$] chattr -i dosyaAdi

Bu hafta neler yaptık ?

© PauSiber