Ubuntu 26.04 sudo-rs geçişi ve sudoers ayarları
Ubuntu 26.04 ile varsayılan olan sudo-rs, joker karakterli sudoers kurallarını desteklemez. Hatalı yapılandırmaları düzeltmek ve doğru argüman eşleşmesi için gerekenleri öğrenin.
Ubuntu üzerinde sudo-rs değişiklikleri
Ubuntu 26.04 LTS, varsayılan sudo olarak sudo-rs ile gelir; bu nedenle yeni kurulmuş bir sunucuda çalıştırılan sudo komutu, orijinal C programı yerine Rust ile yeniden yazılmış sürümü çalıştırır. sudoers dosyalarının çoğu, daha önce olduğu gibi çalışmaya devam eder. Komut argümanları içinde joker karakter (wildcard) kullanılan kurallar ise çalışmaz; çünkü sudo-rs, argüman metni üzerinde glob desen eşleştirmesi yapmaz.
Bu geçişi ilk olarak Ubuntu 25.10 yaptı ve 26.04 LTS sürümünde de bu yapı korundu. Ubuntu 24.04 LTS bu durumdan etkilenmez; çünkü sudo-rs elle kurulmadığı sürece orijinal sudo kullanılmaya devam edilir. Bu durumun önem kazandığı an, Ubuntu 24.04 sürümünden 26.04 sürümüne yükseltme yaptığınız veya yeni sürüm üzerinde yeni bir sunucu kurduğunuz andır. Ara sürümleri de kullanıyorsanız, LTS ve ara Ubuntu sürümlerinin sunucu üzerinde nasıl farklılaştığı konusu, bu tür bir değişikliğin hangi makinede daha önce gerçekleşeceğini açıklar.
Sunucunuzun gerçekte hangi sudo sürümünü çalıştırdığını kontrol edin
Bunu sürüm numarasına bakarak tahmin etmeyin. Doğrudan makineye sorun.
sudo --version
update-alternatives --config sudo
dpkg -l 'sudo*'Kendi sunucunuzdaki sudo --version çıktısına, bu sayfa dahil internetteki herhangi bir sürüm tablosundan daha fazla güvenin. update-alternatives --config sudo cevabın diğer yarısıdır: /usr/bin/sudo için yüklü olan tüm sağlayıcıları listeler ve seçili olanı işaretler. Bir paketin yüklü olması, onun seçili olduğu anlamına gelmez; bu nedenle paket listesini değil, seçim durumunu okuyun.
Geçiş sürecinde her iki uygulama da paketlenmiştir. Rust tabanlı olan sudo-rs, Ağustos 2026 itibarıyla 26.04 sürümünde 0.2.13 versiyonundadır. Todd C. Miller tarafından sürdürülen orijinal sürüm ise hala sudo paketidir; değişen durum, programların .ws soneki taşımasıdır, böylece her ikisi de aynı anda yüklenebilir: /usr/bin/sudo.ws ve /usr/bin/visudo.ws, cvtsudoers.ws ve sudoreplay.ws ile birlikte. Eylül 2026'da 26.04 arşivi üzerinde doğrulandığı üzere: dpkg -L sudo sonekli ikili dosyaları listeler ve sudo-rs, bunların yanında /usr/bin/sudo-rs dosyasını sunar.
Ubuntu neden sudo-rs'e geçti
sudo, setuid root olarak çalışır. Sunucudaki herhangi bir kullanıcı tarafından başlatılabilir ve tam yetkilerle çalışır; bu nedenle içindeki bir bellek hatası, yerel bir root istismarıdır. CVE-2021-3156 tam olarak buydu: herhangi bir yerel kullanıcı tarafından tetiklenebilen bir yığın (heap) arabellek taşmasıydı ve yaklaşık on yıl boyunca yayınlanmış kod içerisinde fark edilmeden kaldı. Rust, bu tür hataları derleme zamanında yakalar; yeniden yazımın temel gerekçesi budur.
İkinci neden kapsamdır ve bu durum yapılandırmanızı doğrudan etkiler. Orijinal sudo, otuz yıl boyunca geniş bir özellik seti biriktirdi ve her özellik, root yetkisiyle çalışan daha fazla kod anlamına gelir. sudo-rs, bilinçli olarak bu özelliklerin bir alt kümesini uygular. Yazarları tarafından niş veya aktif olarak zararlı görülen her şey dışarıda bırakıldı; bu nedenle yıllardır çalışan bir sudoers kuralı artık mevcut olmayabilir. Joker karakter (wildcard) kuralınız da bunlardan biridir.
Bellek güvenliği, bir hata sınıfını ortadan kaldırır. Ancak bu, bir programı hatasız yapmaz; sudo-rs, varsayılan hale geldiğinden bu yana kendi güvenlik yamalarını yayınlamıştır. Diğer tüm yazılımlar gibi onu da yamalamaya devam edin.
Hangi sudoers kuralları çalışmaya devam eder
Dosya aynı dosyadır. sudo-rs, /etc/sudoers dosyasını ve /etc/sudoers.d/ dizinindeki ek dosyaları okur; bir sunucu operatörünün yazdığı olağan tanımlar desteklenir:
deploy ALL=(ALL:ALL) ALLve%sudo ALL=(ALL:ALL) ALLgibi grup biçimleriNOPASSWD:vePASSWD:etiketleriUser_Alias,Runas_Alias,Host_AliasveCmnd_Alias- tam argüman listesi içeren bir komut, örneğin
/usr/bin/systemctl restart app-api - komutu yalnızca hiçbir argüman olmadan çalışmasına izin veren, komutu takip eden
"" - son argümanı
*olan ve takip eden tüm argümanlara izin veren bir komut - o dizindeki tüm komutlara izin veren,
/ile biten bir dizin yolu - bir listeden komut çıkarmak için
! secure_path,env_keep,env_check,timestamp_timeout,passwd_tries,editor,umask,targetpw,rootpwveuse_ptydahil olmak üzereDefaultsöğesinin kullanışlı bir alt kümesi
İki varsayılan ayar farklı davranır ve kullanıcıları yanıltabilir. env_reset, sudo-rs içinde kapatılamaz: her zaman etkindir. use_pty varsayılan olarak açıktır, bu nedenle komut kendi sözde terminalinde (pseudo-terminal) çalışır.
Wildcard sudoers kuralınızın neden eşleşmeyi durdurduğu
Wildcard karakterleri hala tek bir yerde kullanılabilir: komutun dosya adı. %ops ALL = /sbin/fsck* kuralı, sudo fsck ve sudo fsck_exfat komutlarına hala izin verir; çünkü *, dosya sistemi üzerinde eşleştirilen yolun bir parçasıdır.
Argüman listesi içinde sudo-rs yalnızca iki özel biçimi kabul eder ve bunların hiçbiri bir desen (pattern) değildir. "", argüman yok anlamına gelir. Sondaki bir * ise herhangi bir takip eden argüman anlamına gelir. Diğer tüm argümanlar düz metin olarak karşılaştırılır. Bu nedenle %ops ALL = /sbin/service ntp * sorunsuzdur; çünkü ntp düz metindir ve * sondadır. Ancak aşağıdaki gibi bir kural, amaçladığınız hiçbir şeye izin vermez:
deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart app-*app-*, bir argümanın ortasında yer alan bir desendir. sudo-rs bunu genişletmez, bu nedenle kural systemctl restart app-api ifadesini kapsamaz ve sudo komutu reddeder. İki komut, kendi sunucunuzdaki herhangi bir kural hakkında size doğru bilgiyi verir: root olarak çalıştırılan sudo -l -U deploy, ilgili hesabın gerçekte neleri çalıştırabileceğini yazdırır ve sudo visudo -c ise dosyanın ayrıştırılıp ayrıştırılamadığını size bildirir. Rastgele düzenlemelere başlamadan önce bu komutları çalıştırın.
Joker karakter kuralı her zaman bir güvenlik açığıydı
Orijinal sudo uygulamasında, yazdığınız argümanlar tek bir dizgi halinde birleştirilir ve kuralın argüman dizgisiyle bir glob (joker karakter) eşleşmesi üzerinden karşılaştırılır. Bir glob, boşluk karakterlerini de kapsar. Neredeyse herkesin gözden kaçırdığı nokta budur.
sudo-rs dokümantasyonu bunun en net gösterimini sunar. /bin/rm *.txt kuralı, sudo rm -rf /home .txt komutuna da izin verir; çünkü buradaki * ifadesi -rf /home kısmını yutar ve birleştirilmiş dizgi yine .txt ile biter. Kural "yalnızca metin dosyaları" olarak okunur. Ancak bu, "satır .txt ile bittiği sürece herhangi bir argüman" anlamına gelir.
Aynı durum systemctl örneği için de geçerlidir. Argümanlar tek bir birleşik dizgi olarak karşılaştırıldığı için, sondaki bir desen kendisinden sonra eklediğiniz her şeyle eşleşir; bu nedenle restart app-* kuralı, restart app-api ifadesini ve çağrıyı yapanın eklediği diğer tüm argümanları kapsar. Bir argüman içindeki desen, çevresindeki argümanları açığa çıkarır ve bir komutun yetkisi, sahip olduğu argümanlarda gizlidir. sudo-rs, güvenli bir genel biçimi bulunmadığı için bu yapıyı güvenli hale getirmeye çalışmak yerine doğrudan reddeder.
Joker karakteri açık bir komut listesiyle değiştirin
Çoğu joker karakter kuralı, birinin dört satır yazmak istememesinden kaynaklanır. Dört satırı da yazın.
Cmnd_Alias APP_RESTART = /usr/bin/systemctl restart app-api, /usr/bin/systemctl restart app-worker
Cmnd_Alias APP_STATUS = /usr/bin/systemctl status app-api, /usr/bin/systemctl status app-worker
deploy ALL=(root) NOPASSWD: APP_RESTART, APP_STATUSYolun doğruluğundan emin olun. İkili dosyanın /usr/bin/systemctl olduğu bir sistemde /bin/systemctl ismini taşıyan bir kural asla eşleşmez ve bu durum bir izin sorunuyla aynı şekilde hata verir. command -v systemctl ile doğrulama yapın ve çıktısını buraya yapıştırın.
Kuralı /etc/sudoers dosyası yerine kendi özel yapılandırma dosyasına ekleyin; böylece paket yükseltmeleri yaptığınız düzenlemeyle çakışmaz:
sudo visudo -f /etc/sudoers.d/90-deploy
sudo visudo -c
sudo -l -U deployDosyayı isimlendirirken nokta kullanmayın ve sonuna tilde eklemeyin. Orijinal sudo, sudoers.d dizininde nokta içeren dosyaları görmezden gelir; bu nedenle 90-deploy.conf klasik ve sessiz bir şekilde işlevsiz kalır. Bu kurala uymanın bir maliyeti yoktur.
Liste uzadığında root sahipli bir sarmalayıcı kullanın
İzin verilenler kümesi listelenemeyecek kadar büyük olduğunda, karar mekanizmasını sudoers dosyasından çıkarıp root sahipli küçük bir programa taşıyın.
sudo tee /usr/local/sbin/app-restart >/dev/null <<'EOF'
#!/bin/sh
set -eu
case "${1:-}" in
app-api|app-worker) ;;
*) echo "app-restart: not allowed: ${1:-}" >&2; exit 1 ;;
esac
exec /usr/bin/systemctl restart "$1"
EOF
sudo chown root:root /usr/local/sbin/app-restart
sudo chmod 0755 /usr/local/sbin/app-restart
ls -l /usr/local/sbin/app-restartSudoers tarafı bu durumda tek bir komutu tanımlar:
deploy ALL=(root) NOPASSWD: /usr/local/sbin/app-restart *Buradaki sondaki * kullanımı kabul edilebilir; çünkü neyin izin verileceğine sudo değil, betiğin kendisi karar verir. Bu durum yalnızca betik root sahipli olduğunda ve başka hiç kimse tarafından yazılamadığında geçerlidir. Eğer deploy dosyaya yazma yetkisine sahipse, deploy dosyanın içeriğini değiştirip root yetkileriyle herhangi bir komut çalıştırabilir; bu durum, kaldırdığınız joker karakter kuralından daha tehlikelidir. Dosya modunu ls -l ile kontrol edin; çıktı size açık gelmiyorsa, drwxr-xr-x izin dizisini okumayı öğrenmek beş dakikanızı alır. Aynı kural dizin için de geçerlidir: /usr/local/sbin dizini de ilgili hesap tarafından yazılamaz olmalıdır; çünkü yazılabilir bir dizin, dosyanın tamamen değiştirilebileceği anlamına gelir.
İşi sudo kuralı yerine kendi hesabına atayın
Daha doğru soru, komutun neden root yetkisine ihtiyaç duyduğudur. Kendi kullanıcısı altında çalışan bir servis, o kullanıcı tarafından yönetilebilir ve herhangi bir sudoers satırına ihtiyaç duymaz. systemd birimleri için systemd bu kararı zaten polkit'e devreder; bu sayede bir kural, tek bir birimi ve tek bir operatörü tanımlayabilir:
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.systemd1.manage-units" &&
action.lookup("unit") == "app-api.service" &&
subject.user == "deploy") {
return polkit.Result.YES;
}
});Bunu /etc/polkit-1/rules.d/50-app-api.rules olarak kaydedin; böylece deploy, herhangi bir sudo yetkisine gerek kalmadan systemctl restart app-api komutunu çalıştırabilir. Kuralı, onu kullanacak olan tam bağlamdan test edin; çünkü SSH oturumunuzda çalışan bir kuralın, ona güvenmeden önce cron üzerinden de çalıştığını doğrulamak gerekir. Her iki durumda da, işi yapan hesap yalnızca bu iş için var olmalıdır; bu, VPS üzerinde en düşük ayrıcalıklı kullanıcı hesapları arkasındaki temel argümanla aynıdır.
sudo-rs kapsamında nelerin yer almadığı
sudo -E uygulanmamıştır. İhtiyacınız olan değişkenleri bunun yerine Defaults env_keep += "HTTP_PROXY HTTPS_PROXY NO_PROXY" ile tanımlayın ve env_reset özelliğinin her zaman açık olduğunu, dolayısıyla korunmayan her şeyin temizlendiğini unutmayın.
LDAP üzerindeki merkezi sudoers depolaması kaldırılmıştır. sudoers.ldap ve cvtsudoers uygulanmamıştır; ayrıca sudo-ldap paketi 26.04 sürümünde çıkarılmıştır. PAM veya SSSD üzerinden LDAP kimlik doğrulaması çalışmaya devam eder. Kapsam dışı bırakılan kısım, dizin tabanlı politika yönetimidir.
İzin verilen bir komuttan shell escape yapılmasını engellemeye çalışan INTERCEPT uygulanmamıştır. Bu özellik, kararlı bir kullanıcıya karşı hiçbir zaman etkili olmamıştır. Eğer bir kural, bir kullanıcının root yetkisiyle bir düzenleyici veya yorumlayıcı çalıştırmasına izin veriyorsa, kullanıcı zaten root yetkisine sahiptir ve hiçbir sudo seçeneği bunu değiştiremez.
Oturum kaydı özelliği uygulanmamıştır; bu nedenle I/O günlüğü ve sudoreplay bulunmamaktadır. Günlük kaydı yalnızca syslog sistemine gönderilir ve bunu başka bir yere yönlendirecek logfile seçeneği mevcut değildir; bu yüzden sudo mesajları, sisteminizin syslog verilerini halihazırda gönderdiği yere ulaşır.
Tekrar sudo.ws sürümüne geçmeli misiniz?
Bunu yapabilirsiniz; 26.04 döngüsü boyunca orijinal sürüm tam da bu nedenle paketlenmiş halde kalmaya devam edecektir.
sudo apt install sudo
update-alternatives --config sudo
sudo update-alternatives --set sudo /usr/bin/sudo.ws--config çıktısındaki tam yolları bu sayfadan kopyalamak yerine doğrudan sisteminizden alın, çünkü sisteminizin kabul edeceği liste budur. Daha sonra tekrar sudo-rs sürümüne dönmek, alternatifleri aynı listedeki sudo-rs ikili dosya yoluna ayarlamak anlamına gelir.
sudo üzerinde herhangi bir değişiklik yapmadan önce, oturumu açık ve boşta bekleyen ikinci bir SSH bağlantısını hazır bulundurun. Ayrıştırılamayan bir sudoers dosyası veya kurulu olmayan bir ikili dosyaya işaret eden bir alternatif, uzak bir sunucuda root yetkilerine erişiminizi tamamen kaybetmenize neden olabilir. Bu alışkanlık, yeni bir VPS üzerindeki ilk on dakika içinde yaptığınız diğer tüm işlemlerle birlikte uygulanmalıdır.
Geri dönüşü bir çözümden ziyade bir süre kazanma yöntemi olarak görün. Bu size kuralları düzgün bir şekilde yeniden yazmak için bir hafta kazandırır; bu yeniden yazma işlemi kendi başına değerlidir, çünkü sildiğiniz her joker karakterli kural, aslında yazarının fark ettiğinden daha fazla yetki vermekteydi.
FAQ
Ubuntu 26.04 üzerinde sudoers joker karakter kuralım neden çalışmayı durdurdu?
Ubuntu 26.04 LTS, varsayılan sudo olarak sudo-rs sürümünü seçtiği ve sudo-rs, komut argümanları içindeki joker karakter kalıplarıyla eşleşmediği için bu durum yaşanır. Sudo-rs, komutun dosya adında joker karakter kullanımına, argüman olmaması durumunda "" kullanımına ve son argüman olarak tek bir * kullanımına izin verir. /usr/bin/systemctl restart app-* gibi bir kural, bir argümanın ortasına kalıp yerleştirdiği için hiçbir yetki sağlamaz ve komut reddedilir. Hesabın gerçekte hangi yetkilere sahip olduğunu görmek için root olarak sudo -l -U deploy komutunu çalıştırın, ardından kuralı tam komutlarla veya root sahipliğinde bir sarmalayıcı (wrapper) betikle değiştirin.
Ubuntu 26.04 üzerinde orijinal sudo sürümüne nasıl geri dönerim?
Orijinal sürüm, ikili dosyaları .ws sonekini taşıyan sudo paketi içinde gelir. Paketi sudo apt install sudo ile kurun, ardından sudo update-alternatives --set sudo /usr/bin/sudo.ws ile alternatifleri bu dosyaya yönlendirin. Sisteminizin sunduğu tam yolları okumak için önce update-alternatives --config sudo komutunu çalıştırın ve değişiklik yaparken ikinci bir SSH oturumunu açık tutun. Bu işlem, hangi uygulamayı seçerseniz seçin 26.04 sürümünden kaldırılmış olan sudo-ldap özelliğini geri getirmez.
sudo-rs, /etc/sudoers dosyasını aynı şekilde mi okur?
Evet. sudo-rs, /etc/sudoers dosyasını ve /etc/sudoers.d/ altındaki ek yapılandırma dosyalarını; kullanıcılar, gruplar, takma adlar, çalıştırma yetkileri ve NOPASSWD etiketi için aynı sözdizimiyle okur. sudoers dilinin bir alt kümesini uyguladığı için farklılıklar, farklı davranan yapılar yerine eksik olan yapılar olarak ortaya çıkar. Düzenleme yapmak için sudo visudo kullanın, ardından oturumunuzu kapatmadan önce sudo visudo -c ile doğrulayın.
sudo-rs içinde sudo -E yerine ne kullanılır?
sudo -E uygulanmamıştır ve orijinal sudo sürümünde de zaten önerilmemekteydi; çünkü root sürecine, çağıranın kontrol ettiği bir ortamı vermek, o sürecin davranışını değiştirmenin bilinen bir yoludur. Bunun yerine, sudoers içinde Defaults env_keep += "HTTP_PROXY HTTPS_PROXY NO_PROXY" gibi bir satırla gerçekten ihtiyaç duyduğunuz değişkenleri belirtin. env_reset, sudo-rs içinde her zaman etkindir ve devre dışı bırakılamaz; bu nedenle saklamadığınız her değişken temizlenir.