Challenge Lab A: User Management
Senaryoya göre hızlı büyüyen bir şirkette sistem yöneticisi olan bize, sunucuya kullanıcı eklemek, silmek ve düzenlemekle alakalı işler veriliyor. Şirket, 3 yeni departmanı doldurmak için 9 yeni çalışan işe alıyor. Yeni departmanlar: Engineering, Sales ve IS. Sunucunun uygun dosyalar, dizinler, kullanıcılar, gruplar ve yetkilendirmeler ile donatılıp yeni departmanlar için hazır hale getirilmesi gerekiyor.
Öncelikle her departman için /
-kök- dizin altında, departmanın adında dizinler yaratmamız isteniyor. mkdir
komutunu kullanarak dizin yaratma işlemini gerçekleştiriyorum.
mkdir /Engineering /Sales /IS

Her departman için departmanın isminde birer grup oluşturmamız isteniyor. groupadd
komutunu kullanarak grup oluşturma işlemini gerçekleştiriyorum. Grupların doğru bir şekilde oluştuğunu kontrol etmek amacıyla, getent
komutunu group
parametresiyle kullanarak makinede bulunan bütün grupları getirmesini sağlıyorum. Grupları getiren komutun çıktısını grep
komutununa yönlendiriyorum. Komutu-E
parametresiyle kullanarak RegEx
kabul etmesini sağlayıp |
-or- mantıksal sembolünü kullanarak içerisinde departmanın adı geçen satırları ekrana basmasını sağlıyorum.

Her departman için shell’i bash olan, birincil grubu departmanına ait grup olan admin kullanıcıları tanımlamamız isteniyor. useradd
komutuna -s
parametresini /bin/bash
olarak vererek kullanıcının shell’inin bash olmasını sağlıyorum. -g
parametresiyle kullanıcının birincil grubunu belirledikten sonra kullanıcı adını vererek kullanıcıyı oluşturuyorum. Kullanıcıları kontrol etmek için getent
komutunu passwd
parametresi ile kullanarak grep ile istediğim sonuçların gelmesini sağlıyorum.

Her departman için shell’i bash olan ve birincil grupları departmana ait grup olan iki adet normal kullanıcı tanımlamamız isteniyor. Departmanlara ait admin kullanıcılarını oluştururken kullandığım aynı komutları aynı parametreler ile yalnızca kullanıcı adlarını değiştirerek kullanıyorum.

Güvenlik gerekçeleriyle her departmanın ana dizini üzerinde uygulamamız gereken yetkilendirmeler olduğu söyleniyor.
- Departmanlara ait ana dizinin sahibi departmanin admin kullanıcısı olmalı ve dizinin grubu departmana ait grup olmalı.
- Departmanın admini, departmanın ana dizininde tam yetkiye sahip olmalı.
- Bir dosyayı yalnızca dosya sahibi silebilmeli.
- Departmanlardaki normal kullanıcılar da ana dizinde tam yetkiye sahip olmalı.
- Departmanlara ait dizinlere yalnızca departmanın admini ve kullanıcıları erişebilmeli.
İlk olarak chown
komutunu kullanarak dizinlerin sahiplerini ilgili departmanların admin kullanıcıları, gruplarını ilgili departmanların grupları olarak ayarlıyorum. Daha sonra chmod
komutunu kullanarak dizinler üzerinde bizden istenen kısıtlamalara ulaşabilmemiz için, 1770
yetkilerini atıyorum. Bu yetkilendirmedeki ilk sayı olan 1
sayısı Sticky Bit‘i temsil ediyor. Sticky bit, bulunduğu dizin altındaki dosyaları yalnızca sahiplerinin ve root kullanıcısının silebilmesini veya adını değiştirebilmesini sağlar. Diğer kullanıcılar sahiplikleri olmayan dosyalar üzerinde silme veya isim değiştirme işlemini gerçekleştiremezler. Sonrasında gelen 7
sayısı dizin sahibi kullanıcısı için okuma -4-, yazma -2- ve çalıştırma -1- yetkilerinin numerik karşılıklarının toplamını ifade ediyor. Sonraki 7
sayısı ise dizinin grubundaki kullanıcılar için okuma, yazma ve çalıştırma yetkilerinin verilmesini sağlıyor. Sonda bulunan 0
ise dizinin sahibi olmayan ve grubunda bulunmayan bütün kullanıcılar için hiç bir yetki verilmediğini ifade ediyor.

Bizden son olarak her departman dizini altında bir döküman dosyası oluşturmamız isteniyor. Dosyanın sahibi, dizinin de sahibi olan kullanıcı olacak. Dosyanın içeriğinde, “This file contains confidential information for the department.” satırı bulunacak. Dosya üzerinde departmanın admin kullanıcısının yazma izini olacak, departmana ait grupta bulunan kullanıcılar okuyabilecek ve diğer kullanıcıların hiç bir yetkisi olmayacak.

Dosyanın içerisinde bulunmasını istedikleri metini echo
komutuyla döndürerek gerekli dizinin altında dosyayı oluşturuyorum. Dosyanın sahibini departmanın admin kullanıcısı ve grubunu departmanın grubu olarak chown
komutuyla atıyorum. Dosyanın izinlerini chmod
komutuna 740
değerlerini vererek ayarlıyorum. İlk 7
değeri dosyanın sahibinin okuma, yazma ve çalıştırma haklarını veriyor. İkinci sıradaki 4
değeri dosyanın grubundaki kullanıcılara yalnızca okuma yetkisi veriyor. Sondaki 0
değeri dosyanın sahibi olmayan veya grubunda bulunmayan bütün kullanıcılar için hiç bir yetki tanımlamıyor.
Challenge Lab B: Bash Scripting
Bir önceki meydan okumada yaptığımız işlere benzer işleri daha hızlı halletmemizi sağlayacak bir bash script yazmamız isteniyor. Yazacağımız script:
- Kullanıcıdan bir grup adı alacak. Aynı isimde bir grup hali hazırda mevcutsa uyarı verecek değilse o isimde grubu yaratacak.
- Kullanıcıdan bir kullanıcı adı alacak. Aynı isimde bir kullanıcı hali hazırda mevcutsa uyarı verecek değilse o isimde kullanıcı yaratacak. Kullanıcının shell’i bash olacak ve grubu bir önceki adımda oluşturulan grup olacak.
- Kullanıcı için şifre belirlenecek.
- / dizini altında kullanıcı adında bir dizin oluşturulacak.
- Oluşturulan dizinin sahibi oluşturulan kullanıcı, grubu oluşturulan grup olarak atanacak.
- Oluşturulan dizinde kullanıcı ve grubu tam yetkiye sahipken diğer kullanıcıların yetkisi olmayacak.
- Dizinde oluşturulan dosyaları yalnızca sahibi ve root kullanıcısı silebilecek.
Bizden istenenleri dikkate alarak bir bash script hazırlıyorum:
#!/bin/bash username=$1 group=$2 if [ `getent group "$group"` ]; then echo 'This group already exist' exit elif [ `getent passwd "$username"` ]; then echo 'This user already exist' exit else groupadd $group useradd -s /bin/bash -g $group $username passwd $username mkdir /$username chown $username:$group /$username chmod 1770 /$username echo "Completed" fi
Script çalıştırılırken kullanıcı adını ilk parametre, grup adını ikinci parametre olarak alıyorum. Girilen kullanıcı adı ve grup hali hazırda kullanılıyorsa kullanıldığına dair bir uyarı bastırıp script’i sonlandırıyorum. Aksi halde önceki meydan okumada kullandığımız komutlarla bizden istenen işlemleri yerine getirerek gerekli kullanıcıyı, gerekli grubu ve gerekli dizini oluşturuyor ve dizinin izinlerini düzenliyorum.

Oluşturduğum script’e çalıştırılabilir yetkisini vermek için chmod
komutunu +x
parametresiyle kullanıyorum ve ./
ile scripti çalıştırıyorum.
Challenge Lab C: Log File Archiving
Sistemde şüpheli aktiviteler olduğu söyleniyor. Bizden, şu ana kadar loglanmış olan verileri kaybetmememiz için /var/log
dizini altında .log
uzantısıyla biten bütün dosyaları kullanıcının home dizini altında archive
isminde bir dizin oluşturup log.tar
isminde sıkıştırarak tutmamız isteniyor. Daha sonra bu dosyaları yine home dizini altında backup
isminde bir dizin oluşturarak bu dizinin altına çıkartarak inceleyebileceğiz.
İlk olarak home dizini altında mkdir
komutunu kullanarak archive isminde bir dizin oluşturuyorum. Sonra /var/log
dizinine giderek tar
komutuna c
-create- ve f
parametreleriyle dosyayı archive dizini altında oluşturuyorum. Oluşturduğum dosyayı t
-list- ve f
parametreleriyle kontrol ediyorum.

Kullanıcının home dizini altında backup
dizinini oluşturuyorum. Oluşturduğumuz dizine geçtikten sonra tar
komutuna x
–extract- ve f
parametrelerini vererek log.tar
dosyasını dizin içerisine çıkartıyorum.

Challenge Lab D: Pipes, Redirection, and REGEX
Bir personel aktif linux image’i üzerinde tanınan servislerin bir listesini istiyor. Servis bilgilerine /etc/services dosyasından ulaşabiliriz fakat temiz bir çıktı elde etmemiz için dosyadan sadece istediğimiz bilgileri almamız gerekiyor. Bizden istenenler:
- Dosyadan bütün servis isimlerini almamız gerekli.
- İsimler, alfabetik olarak sıralanmalı ve tekrar etmemeli.
- Boş satırlar ve herhangi bir harf ile başlamayan satırlar alınmamalı.
- Çıktı uniqueservices.txt dosyasına kaydedilmeli.
Dosyadan sadece alfabetik karakterler ile başlayan satırları almak için grep
komutuyla başlıyorum. Komuta -E
parametresini vererek RegEx
kabul etmesini sağlıyorum. Başta verdiğim ^
karakteri kendisinden sonra gelen karakterler ile başlayan satırlar ile eşleşiyor. Sonrasında gelen [a-zA-Z]
küçük ve büyük a’dan z’ye bütün alfabetik karakterleri içeriyor. Daha sonra dosya adını vererek o dosya içerisinde alfabetik karakterler ile başlayan bütün satırları alabiliyorum.
Dosya kendi içersinde birden çok bölümden oluştuğu için cut
komutunu kullanarak sadece işime yarayan bölümü alıyorum. Verdiğim -d
parametresi alanları birbirinden hangi karaktere bakarak ayıracağını söylüyor. Sonraki -f
parametresiyle ayrılan bölümlerden kaçıncısını veya kaçıncıları ekrana basacağını anlatıyor. İlk cut
komutu ile dosyanın yorum satırı olmayan baştaki tarafını kırpıyor ikinci cut
komutu ile servisin adını kırpıyorum.
Aldığım servis isimlerini alfabetik olarak sıralamak için sort
komutunu kullanıyorum. Komuta -u
parametresini vererek satırların tekrar etmesini de önlüyorum ve çıktıyı uniqueservices.txt
dosyasına yönlendiriyorum. Aynı zamanda oluşturduğum dosyada kaç satır olduğunu saydırmak istiyorum. Komutlar arasına koyduğum &&
ilk komut STDERR
döndürmeden tamamlanırsa ikinci komutun çalışmasını sağlıyor. Daha sonra wc
komutunu -l
parametresi ile kullanıyorum ve dosyadaki satır sayısını da elde ediyorum.
grep -E '^[a-zA-Z]' /etc/services | cut -d ' ' -f1 | cut -f1 | sort -u > uniqueservices.txt && wc -l uniqueservices.txt
