Sudoers Dosyası

Kullanıcıların başka bir kullanıcının güvenlik ayrıcalıklarıyla programları çalıştırmasını sağlayan, Unix benzeri bilgisayar işletim sistemlerine yönelik bir programdır. Varsayılan olarak super user do anlamına gelir. Sudo komutu bir komutu uygulama yetkisi ile çalıştırmak için kullanılır. Dosya sistemine baktığımız zaman bin ve sbin dizinlerinin içindeki programlara baktığımız zaman, sbin'in içindeki programlarının genellikle normal kullanıcılar tarafından yürütülmeyen komutları içerir. Dosya sistemi hiyerarşisi kılavuz sayfasına bir göz atabilirsiniz.
man hier
Sudo program sayesinde sisteme root olarak login olmanıza veya erişim izini vermenize gerek yoktur. Zaten root ile oturum açılma yeteneği verilmesi istenilen bir durum değildir. Sudo komutunu normal bir kullanıcı kullanırsa komut hata vererek işlem gerçekleştirmez ve sistemde loglanır. Kullanıcı sudo komutunu girdiğinde sistem sudoers dosyasını kontrol ederek komutu çalıştıran kullanıcının yetkilerine bakar. Eğer yetki var ise varsayılan olarak parola sorar ve işlemi gerçekleştirir.
Örneklere başlamadan önce dosyayı yedekliyorum.
sudo cp /etc/sudoers /etc/sudoers.bak
Sudoers Kullanıcı Yetkilendirilmesi
sudo parametre verilmeden çalıştırılırsa root kullanıcısı olarak işlem yapmaya çalışır ve loglanır. sudo ile çalıştırılan komutun root olarak çalışabilmesi sudo programında aşağıda görülen s biti yani setuid ile mümkün olmaktadır. Programlar kendisini çalıştıran kullanıcı yerine kendisine sahip olan root kullanıcının hakları ile çalışırlar.

sudoers dosyasına erişim sağlamak için visudo komutu veya /etc/sudoers dosyasını editör ile açmanız yeterlidir.
sudoers dosyasının muhakkak visudo programı ile değiştirilmesi gerekir. Bunun sebebi visudo dosya güncellenirken sentaks kontrolü yaparak hatalı bazı konfigürasyonların kaydedilmesine izin vermez. Eğer manuel dosya düzenlemesi yaparsanız, istemediğiniz sonuçlar ile karşılasabilirsiniz.
sudo visudo
sudo vi /etc/sudoers
Sudoers içindeki root kullanıcısının olduğu satırı yorumlayacak olursak makinanın tamamında bütün komutları çalıştırır.

- root ALL=(ALL:ALL) ALL – Kullanıcı adı
- root ALL=(ALL:ALL) ALL – Sunucunun tamamındaki yetkilendirme
- root ALL=(ALL:ALL) ALL – Tüm kullanıcıları tanımlar.
- root ALL=(ALL:ALL) ALL – Tüm grupları tanımlar.
- root ALL=(ALL:ALL) ALL – Komutlarının tamamını tanımlar.
Eğer görseldeki gibi, NOPASSWD eklenirse, kullanıcı sudo komutlarını çalıştırırken sistem parola istemez.

Sudo ile bir kullanıcının işlem yapabilmesi için sudoers dosyası içinden kullanıcıya yetki verilmelidir. Şimdi bir kullanıcıya basit bir şekilde yetki verelim.
sudo visudo
Varsayılan olarak nano editör ile açılabilir, vi edötürü kullanmak için aşağıdaki komut satırını yürütebilirsiniz.
sudo EDITOR=vi visudo
Dosya editör ile açıldıktan sonra, sistemde ekli olan mehmet kullanıcısını ekleyip tüm yetkileri veriyorum ve kayıt ediyorum.

Şimdi ise mehmet kullanıcısına geçip, root kullanıcısına geçiş yapmayı deniyorum ve başarılı bir şekilde yetki yükseltmiş oluyoruz.
sudu su username
sudo su

Sudoers dosyasında olup olmadığınızı ve çalıştırabileceğiniz komutları kontrol etmek için aşağıdaki komutu çalıştırmanız yeterlidir.
sudo -l

Aynı şekilde bir kullanıcının parola girmemesini isterseniz NOPASSWD: argümanını yazmanız gerekmektedir. Artık sudo ayrıcalıkları kullanırken herhangi bir parola girmenize gerek kalmaz.

Kullanıcıların ihtiyaçlarına göre yetki verilmesi en doğrusudur. Sadece belirli kaynaklar için süper kullanıcı yetkisi verebiliriz. Sistemde bulunan mehmet kullanıcısına swap ile ilgili işlem yapması için izin veriyorum. NOPASSWD: parametresi ekleyerek parola sormasınıda istemiyorum.
sudo visudo
mehmet ALL=(ALL:ALL) NOPASSWD: /sbin/swapon

Mehmet kullanıcısına geçiş yapıyorum. İlk olarak swap kullanımı iptal edip, kontrol ediyorum. İşlem başarılı bir şekilde gerçekleştiğini gördükten sonra, tekrar aktif edip, test ediyorum.
su mehmet
sudo swapoff /swapfile
swapon -s
sudo swapon -a
swapon -s

Sudoers içindeki tanımlamalar Alias’lar yardımıyla yapılır. Alias’lar birden çok girdiyi depolayabilen değişkenlerdir. User, Runas, Host ve Cmnd Alias olarak 4 çeşitlerdir.
sudoers dosyasının muhakkak visudo programı ile değiştirilmesi gerekir. Bunun sebebi visudo dosya güncellenirken sentaks kontrolü yaparak hatalı bazı konfigürasyonların kaydedilmesine izin vermez. Eğer manuel dosya düzenlemesi yaparsanız, istemediğiniz sonuçlar ile karşılasabilirsiniz.
User_Alias
Kullanıcı takma adları, kullanıcı gruplarını belirtmek için kullanılır. Aslında burada delegasyon işlemi gerçekleştiriyoruz. Bir işi birden fazla kullanıcı yapacak ise bunlar tek çatı altında toplamış oluyoruz. Bu işlemi kullanıcı veya grup bazlı olarak gerçekleştirebiliriz. Kullanıcı adlarını, sistem gruplarını (% ön eki ile) ve ağ gruplarını (ön eki + ile) aşağıdaki gibi belirleyebilirsiniz. Aşağıdaki görselde ilk olarak bir alias belirleyip 2 adet kullanıcı ekledim. Sonrasında ise sistem üzerinde güncelleme, yükleme, silme vb. bir çok işlemi yapabilmesi için /usr/bin/apt* aracını kullanmasına izin verdim.
Bunun dışında işlem yapacağınız kullanıcı sayısı sürekli dinamik bir yapıda ve fazla ise, kullanıcıları bir gruba bağlayıp bu grup üzerinden de aşağıdaki gibi işlemleri gerçekleştirebilirsiniz.
! karakterini, kullanıcıları bir takma addan hariç tutmak için kullanabilirsiniz. User_Alias LIMITED_USERS = USERS, !WEB, !DATABASE

Şimdi yaptığımız konfigürasyonun doğruluğunu kontrol edelim. İlk olarak mehmet kullanıcısına geçip, kaynak listesini güncellemeye çalışıyorum.

Başarılı bir şekilde kaynak listesini güncelledi. Şimdi ise yetkimiz olmayan bir işlem yapmaya çalışıyorum ve makina üzerinde swap kullanımını kapatıyorum. İşlemi gerçekleştiremediğimi görüyorum.

Şimdi ise ayse kullanıcısına geçelim ve bir yazılımı kaldırmaya çalışalım. İşlemin başarılı olduğunu doğruluyorum.

Runas_Alias
Runas Takma Adları, kullanıcı takma adlarıyla hemen hemen aynıdır, ancak kullanıcıları kullanıcı kimliklerine göre belirlemenize izin verilir. Bu, kullanıcı adları ve gruplar dizeler olarak eşleştirildiğinden yararlıdır, böylece aynı kullanıcı kimliğine sahip ancak farklı kullanıcı adlarına sahip iki kullanıcı tek bir kullanıcı adı girilerek eşleştirilmez, ancak bir kullanıcı kimliği ile eşleştirilebilir. Biraz karmaşık gelebilir, aslında bir komutu başka bir kullanıcı gibi çalıştırmamıza olana sağlıyor. Temelde ikiye ayırabiliriz.
- İlk Runas_List, komutun sudo'nun -u seçeneği aracılığıyla hangi kullanıcılar olarak çalıştırılabileceğini gösterir.
- İkincisi, sudo'nun -g seçeneği ile belirtilebilecek bir grup listesi tanımlar.
Sudo'ya " -u " ve " -g " argümanı seçeneğini kabul etmesini söyleriz, burada " -u " komutu/komut dosyasını ilgili kullanıcı olarak çalıştırır ve " -g " ilgili grupla aynı şeyi yapar.
#Kullanıcı bölümü sözdizimi:
USER_SPACE HOST = RunAs(User) COMMAND
#Grup bölümü sözdizimi:
USER_SPACE HOST = RunAs(:Group) COMMAND
#Kullanıcı ve grup bölümü sözdizimi:
USER_SPACE HOST = RunAs(User:Group) COMMAND
Örnek yaparak daha iyi anlaşılmasını sağlayalım. Gördüğünüz gibi aşağıdaki betiğin hem kullanıcısı hem de grubu "root:root" ve kullanıcının bu komut dosyası için yürütülebilir izni var.

Eğer bu betiği " root " kullanıcısı olarak çalıştırırsam düzgün bir şekilde yürütüldüğünü görebilirim.. Bunu başka bir "x" kullanıcısı olarak çalıştırmayı denediğimde izinlerden dolayı çalışmadığını görebilirim.

sudo komutu işe yarayabileceğini umarak komut dosyasını sudo erişimiyle çalıştırmaya çalışabiliriz. Ancak, bu istediğimiz bir şey değildir. Unutmayın, Büyük güç büyük sorumluluk getirir.
# UID 0 normalde kök için kullanılır.Aşağıdaki satırdaki karenin (#) bir yorumu değil, bir kullanıcı kimliğini gösterdiğine dikkat edin.
Runas_Alias ROOT = #0
# Bu, daha önce ayarlanan ADMINS'in User_Alias'ına benzer tüm yönetici kullanıcılar içindir. "kök" eklenmesiyle
Runas_Alias ADMINS = %admin, root
Host_Alias
100'lerce sunucuya sahip büyük bir ağınızın olduğunu düşünün. Örneğin bazıları bir DNS sunucusu, bazıları WEB sunucusu olabilir. Bu durumda ilgili kullanıcıya birden çok makinada sudo rolleri atamamız gerekir. Yani, bir kullanıcının birden fazla ana bilgisayarda sudo izniyle bazı görevleri yürütmesine izin vermek istiyorsanız, sudoers tabanlı bir dahili değişken olan Host_Alias değişkenini kullanabilirsiniz.
Örneğin, mehmet kullanıcısı 4 adet web sunucusunda web servisini yeniden başlatabilsin.
# DNS ve WEB Sunucuları
Host_Alias SERVERS = DNS01, DNS02, WEB01, WEB02
mehmet Host_Alias=(ALL) /usr/bin/systemctl restart ssh
Aşağıdaki görseli incelediğimiz zaman, ilk olarak bir host alias tanımlayıp bunlara web sunucu makinalarını eklediğimizi görmekteyiz. İkinci adımda ise, mehmet kullanıcısına SERVERS takma adına ilgili web servisleri başlatabileceği path'leri göstermişiz.

İlgili sunucularda, mehmet kullanıcısında nginx servisini yeniden başlatmaya çalışıyorum. Başarılı bir şekilde gerçekleşiyor. Host Alias'ın çok sayıda makinada kullanışlı olduğunu unutmayalım.

Cmnd_Alias
Komut takma adları, komutların ve dizinlerin listeleridir. Bunu bir grup komut belirtmek için kullanabilirsiniz. Bir dizin belirtirseniz, o dizindeki herhangi bir dosyayı içerecek, ancak herhangi bir alt dizini içermeyecektir. '"sudoedit"' özel komutu, kullanıcıların sudo'yu -e bayrağıyla veya sudoedit komutu olarak çalıştırmasını sağlar . Bir takma addaki bir komuta komut satırı bağımsız değişkenleri eklerseniz, bunlar kullanıcının komut satırına girdiğiyle tam olarak eşleşmelidir. Aşağıdakilerden herhangi birini eklerseniz, ters eğik çizgi (\): ",", "\", ":", "=" ile kaçmaları gerekir.
Örneğin;
# Tüm kapatma komutları
Cmnd_Alias SHUTDOWN_CMDS = /sbin/poweroff, /sbin/reboot, /sbin/halt
# Yazdırma komutları
Cmnd_Alias PRINTING_CMDS = /usr/sbin/lpc, /usr/sbin/lprm
# Yönetici komutları
Cmnd_Alias ADMIN_CMDS = /usr/sbin/passwd, /usr/sbin/useradd, /usr/sbin/userdel, /usr/sbin/usermod, /usr/sbin/visudo
# Web komutları
Cmnd_Alias WEB_CMDS = /etc/init.d/apache2
Bir kaç örnek yaparak, daha iyi anlaşılmasını sağlayalım. Mehmet kullanıcısının sunucuyu kapatma, yeniden başlatma gibi işlemler yapmasını istiyorum. Mehmet kullanıcısında ilk olarak makinayı yetkim olmadığı için yeniden başlatamadığımı görüyorum.

Bizden sudoers dosyasında gerekli izinleri vermemizi istiyor. Yetkili kullanıcıma geçip sudoers dosyasını açıyorum. Makina üzerinde kapatma, yeniden başlatma gibi işlemler için takma adı sudoers dosyasına ekliyorum. Akabinde istediğiniz kullanıcı veya gruba SHUTDOWN_CMDS parametresini ekliyorum.
sudo visudo
Cmnd_Alias SHUTDOWN_CMDS = /sbin/poweroff, /sbin/reboot, /sbin/halt

Tekrar makinayı yeniden başlatmaya çalıştığımda işlemin başarılı olduğunu görüyorum.

Kullanıcı oluşturma, silme, gruba ekleme, parola sıfırlama gibi bir çok işlemleri yapmak için aşağıdaki takmadı adı kullanabilirsiniz.
Cmnd_Alias ADMIN_CMDS = /usr/sbin/passwd, /usr/sbin/useradd, /usr/sbin/userdel, /usr/sbin/usermod
Disk işlemleri için, aşağıdaki takmadı adı kullanabilirsiniz.
Cmnd_Alias HDD = /usr/bin/mount, /usr/sbin/fdisk, /usr/sbin/mkfs
Sudo Grubuna Kullanıcıları Ekleme
Dağıtımları baz alırsak, RHEL tarafında wheel grubu, Debian tarafında sudo grupları bulunmaktadır. Kullanıcıları bu gruplara ekleyerek tüm komutları çalıştırmasını sağlayabilirsiniz.
RHEL | Oracle Linux | Centos
sudo usermod -aG wheel username
Debian | Ubuntu
sudo usermod -aG sudo username
Kullanıcıların ekli olduğu grupları görmek için groups komutunu çalıştırmanız yeterlidir.
groups
Sudo Püf Noktalar
Sudo ayrıcalık gerektiren komutları çalıştırırken, baze sudo yazmayı unutabiliyoruz. Bu durumlarda sudo !! yazarsanız, komut satırın başına sudo eklenerek tekrar edilecektir .
apt update
sudo !!

Parolanızı kullanıp kimliğinizi doğruladıktan sonra , parolanızı yeni dağıtımlarda 15 dakika boyunca başka komutlarla kullanmak zorunda kalmayacaksınız. Kimlik doğrulamanızı hemen unutulmasını istiyorsanız, aşağıdaki opsiyonu kullanabilirsiniz.
sudo -k
Sudoers dosyasında olup olmadığınızı ve çalıştırabileceğiniz komutları kontrol etmek için aşağıdaki komutu çalıştırmanız yeterlidir.
sudo -l

Sudoers dosyasınındaki satırın sözdizimsel olarak doğru olduğunu iki kez kontrol etmek isterseniz , visudo opsiyonlu olarak kullanabilirsiniz.
sudo visudo -c

sudo başarısız komut denemelerini ve çalıştırılan komutları /var/log/auth.log dosyasında loglamaktadır.
sudo tail -f /var/log/auth.log
