NDG Linux Essentials Challenges

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 xextract- 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