Sudoers Dosyası

Commande sudo : comment configurer sudoers sous Linux ? | IT-Connect

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.

How To Add a User to Sudoers On Debian 10 Buster – devconnected

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 
Blog'a Dön