Bir program sudo altında çalıştırıldığını söyleyebilir mi?


27

"Sudo" altında çalıştırılıyorsa, farklı davranması gereken bir program var. Sudo'da çalıştırılıp çalıştırılmadığını öğrenmenin bir yolu var mı?

Güncelleme: Birisi neden bunu yapmak istediğimi sordu. Bu durumda, MacPorts kullanan bir Mac'te, belirli bir komutu kesip yapıştırmanızı söyleyen bir çıktı vardır. MacPorts komutu "sudo" ile çalıştırıldıysa, sample komutuna sudo içermelidir:

$ sudo port selfupdate 
--->  Updating MacPorts base sources using rsync
MacPorts base version 2.2.1 installed,
MacPorts base version 2.2.1 downloaded.
--->  Updating the ports tree
--->  MacPorts base is already the latest version

The ports tree has been updated. To upgrade your installed ports, you should run
  port upgrade outdated

^^^^^^^^^ it would be really sweet if it output "sudo port upgrade outdated" instead.  It would be even better if it just did it for you :-)

Merak ediyorum: nasıl farklı davranması gerektiğini açıklayabilir misiniz?
sciurus,

1
@sciurus genellikle ortak kullanım durumu, root yetkileri gerektiren bir kurulum betiğindedir; yoksa onları hemen hemen öl.
Nick T,


O root olarak yayınlandığında ben belli belirsiz bazı komut farkında olduğunu hatırlamıyorum ya da değil ... Ben cevabı "evet" olduğunu düşünüyorum
Rolf

Yanıtlar:


48

Evet, bir program sudo altında çalışırken ayarlanan 4 çevre değişkeni vardır:

$ sudo env |grep SUDO
SUDO_COMMAND=/usr/bin/env
SUDO_USER=tal
SUDO_UID=501
SUDO_GID=20

Bunlara basitçe ayarlayarak sahte olabileceğini unutmayın. Kritik bir şey için onlara güvenme.

Örneğin: Bu programda, kullanıcıya başka bir programı çalıştırmasını söylememiz gerekir. Geçerli olanı sudo ile çalıştırıldıysa, diğeri de olacaktır.

#!/bin/bash

echo 'Thank you for running me.'

if [[ $(id -u) == 0 ]]; then
  if [[ -z "$SUDO_COMMAND" ]]; then
    echo 'Please now run: next_command'
  else
    echo 'Please now run: sudo next_command'
  fi
else  echo 'Error: Sadly you need to run me as root.'
  exit 1
fi

Yalnızca SUDO_ * değişkenini test ettiğini, önce root olarak çalıştığını kanıtlayabildiğini unutmayın. O zaman bile sadece bazı yararlı metinleri değiştirmek için kullanır.


2
"Kritik bir şey" için ne kullanırdım?
Kevin - Monica

3
@Kevin, çevresiyle birlikte yüksek ayrıcalıklara sahip olmak için can atıyorsa, ne yaptıklarını bilir ve sonuçları kabul eder.
Nick T,

Reddedildi, çünkü “kritik bir şey için onlara güvenmeyin” olarak nitelendirilmesi gereken herhangi bir cevap, hiç bir cevap değil, çirkin bir saldırıdır.
Stephen C,

Bu, sorulan soruya kabul edilebilir bir cevaptır. Uyarı , sadece tespit etmek yerine, sudo kullanımını engellemeye çalışan insanlar için orada olmalı . Kullanıcının çalıştırabileceği komutları sınırlandırmak için sudo komut takma adları kullanılarak önleme yapılmalıdır.
dwurf

11

Bu, doğrudan soruyu yanıtlamıyor ancak doğru sorunun burada sorulduğunu sanmıyorum. Bana göre, asker belli izinleri varsa veya olmasa da muhtemelen farklı davranacak bir program istiyor, ancak sudo'yu kontrol etmenin böyle bir yol olmadığını iddia ediyorum. Öncelikle birçok sistem bir "sudo" uygulayamayabilir, Linux ya da birçok Unix için gerekli değildir.

Örneğin, bir kullanıcı önceden kök olarak giriş yapmış olabilir, sudo'yu sansürsüz hale getirebilir ya da belki de sistem, programın yapmak isteyebileceği idari görevi yerine getirme yeteneğine sahip olmayan kök kullanıcılara sahiptir. Sonunda, belki de sistemde kök veya sudo yoktur ve bunun yerine, farklı yeteneklere sahip zorunlu bir erişim kontrol sistemi kullanır ve sudo yapmak için tüm süper kullanıcıları yakalamaz. Ya da kullanıcı gizlice ayrılabilir, ancak güvenlik nedeniyle kendi hesabından daha az izni olan bir hesaba girebilir (Sık sık güvenilmeyen bir kodla, geçici olarak ayrıcalıklı olmayan bir kullanıcı ile yalnızca ramdisklere yazmak için yazabilirim, izinlerimi yükseltmeyebilirim. ). Genel olarak sudo ya da kökün varlığı gibi belirli bir izinler modelini varsaymak ya da sudo bir kullanıcının herhangi bir özel ayrıcalıklara sahip olduğunu varsaymak kötü bir fikirdir.

Bir işlemi gerçekleştirmek için izniniz olup olmadığını öğrenmek istiyorsanız, en iyi yol genellikle basitçe denemek ve yapmaktır. Ardından, başarısız olursa veya başarılı veya tamamen başarılı olması gereken çok aşamalı bir işlemse, izin sorunları olup olmadığını kontrol edin. Bir operasyonun POSIX erişim fonksiyonu gibi fonksiyonlarla çalışıp çalışmadığını kontrol edebilirsiniz (izinler aktif olarak değiştiriliyorsa burada olası yarış koşullarına dikkat edin)

Ek olarak, sudo'nun arkasındaki gerçek kullanıcıyı tanımanız gerekiyorsa, altta yatan bir uçbirim ile herhangi bir etkileşimli oturum için çalışması gereken getlogin işlevini kullanabilirsiniz ve örneğin, denetleme için komutu çalıştırmanın veya "kimin buldığını " bulmanızı sağlar. günlükleri kaydetmek için gerçek kullanıcının ana dizini.

Son olarak, gerçekte istediğiniz şey bir kullanıcının root erişimine sahip olup olmadığını bulmaksa (Yine de kötü bir fikir ama daha az uygulamaya özel) getuid'i 0 bir kullanıcı kimliği olup olmadığını kontrol etmek için kullanabilirsiniz .


7

Kullanılabilecek iki mekanizma var.

  • Ortam değişkenlerini kontrol etmek her iki şekilde de yapılabilir, ancak yapılması en kolay yoldur. growisofsSUDO altında çalışmayı sevmediğim için SUDO değişkenlerini kullandığım betiklerde ayarlarım. Diğer şekilde numaralandırılabilir. (SUDO değişkeni, at ve toplu komutların altında çalışan komut dosyaları için de ortama taşınır.)
  • Sudo altında çalışıp çalışmadığınızı görmenin başka bir yolu da, sudo aradığınız süreçten ana süreçten yürümektir. Bu şekilde sudo altında çalıştığını gizlemek zor olurdu, ama daha karmaşık. Suçlu altında koşarken taklit etmek hala mümkün.

Uygun kullanıcı olarak çalışıp çalışmadığınızı kontrol etmek daha yaygındır. idKomut Bunu yapmak için de kullanılabilir. TomOnTime komut dosyası , bir sonraki komutu çalıştırmak idgerekip sudogerekmediğini belirlemek için komutu kullanır .


1
> Bu şekilde sudo altında çalıştığınızı gizlemek zor olurdu:sudo İkili dosyayı başka bir şeyle yeniden adlandıramaz mısınız? Ya sudoda tersini yapmak için başka bir çalıştırılabilir dosya adı verin ? Değil Gerçekten kimsenin aklı başında ... bunu yapmak beklediğiniz o
Bob

@Bob Yürütülebilir dosyayı rootyeniden adlandırmak için erişmeniz gerekir sudo. Normal bir kullanıcı bunu yapamaz. Altında olduğun gibi sahte olabileceğini not ettim sudo. Mevcut bir programı yeniden adlandırmak işe yarar. Özel bir sahte sudoprogram için gereken kod önemsizdir.
BillThor,

sudo ikili dosyasını bir yerden indirebilir ve doğru izinleri verebilirsiniz ...
Jens Timmerman

@JensTimmerman Doğru izinleri vermek için root erişimine ihtiyacınız var. Eğer sadece yeniden adlandırabilir veya sabit link. İndirmeye gerek yok. SUID'yi bir hedef kullanıcı kimliğine yüklerseniz (bu şekilde çalışacaksa), hedef kullanıcı kimliğini zaten tehlikeye atmış olmanız gerekir.
BillThor

ah, tamam, setuid olmadan çalışmayı reddediyor, benim kötüm ...
Jens Timmerman

2

Etkili ve gerçek kullanıcı kimliğini karşılaştırabilirsiniz.

Bu kesinlikle sudo çalıştığını anlamına gelmez (ayrıca ayarlanabilir), ancak programın kullanıcının beklediğinden daha fazla hakka sahip olduğunu gösterir. (örneğin, normalde bu haklar olmadan yürütülen, ancak yükleme sırasında ya da güncellemeleri yüklemek için onlarla çalıştırılması gereken bir programda. Sonra, bu konuda bazı geri bildirimler vermek için bunu kullanabilirsiniz).


2
Hayır, sudohem etkili hem de gerçek kimliği ayarlar. İntiharın aksine, ki değil. İşte test etmek için kullanabileceğiniz önemsiz bir C programı (üzgünüm, yorum yeni satırları kaldıracak, tekrar eklemek zorunda kalacaksınız):#include <stdio.h> #include <unistd.h> #include <sys/types.h> int main() { printf("real = %i, effective = %i\n", getuid(), geteuid()); return 0; }
derobert

... veya, alternatif olarak,perl -E 'say $<, "\n", $>'
derobert

2

Etkili UID (EUID) değişkenini aşağıdaki gibi kontrol edebilirsiniz:

if [[ $EUID -eq 0 ]]; then
    echo "running as root"
else
    echo "not running as root"
fi

Bu soruya cevap vermiyor. Kod, sudo olarak çalıştırıldığında olduğu gibi root olarak çalıştırıldığında da aynı çıktıyı verir.
Stephen C

@StephenC - OP’nin amaçları açısından hiçbir fark olmadığını düşünüyorum. IMHO'nun amacı, sudo yürütme veya otantik bir kök kabuğundan yürütme işlemini ayrım yapmadan tanımlamaktır.
Eliran Malka

1
Ben doğru olabileceğini düşünüyorum. Buraya geldim, çünkü neden sudo echo $USERayrıcalık olmayan kullanıcı adını yazdırdığını anlamadım (değişken sudo'dan önce değiştirilmiş). Aslında kodumu kodumda kullandım. Teşekkür ederim!
Stephen C

en hoşgeldin :)
Eliran Malka

-1

Bir dosyaya /rootve sonra if -eona dokunabilirsiniz . Ve eğer -e doğruysa rm(hata kodunu kontrol ederek), böylece testiniz bir dahaki sefere çalışır.

Rm'den sonra hata kodunu (veya dönüş kodunu) kontrol etmek, birinin size eşek şakası yapmak üzere dosyayı oluşturmak için sudo güçlerini kolayca kullanmasını önler.


4
Bu cevap, işlemin yazma iznine sahip olup olmadığını kontrol eder /root(bu, mutlaka UID 0 ile çalışmakla aynı değildir), ancak bu izinleri kullanarak izinleri alıp almadığını kontrol etmez sudo.
Ladadadada

Evet, "bir kediyi cildin bin yolu"; Cevabı yazarken, başka bir 4 veya 5 şey düşündüm, bu yüzden tamamladım.
Chris K,

-2

Bunun bunun için iyi çalıştığını buldum

[ $(cat /proc/$PPID/loginuid) -ne 0 ] && [ "$USER" == "root" ]

FreeBSD, Centos7 veya MacOS X'te denediğimde bu işe yaramıyor. Sanırım "/ etc" yerine "/ proc" demek istiyorsun. Ancak bu değişiklikle bile, bu üçünün hiçbirinde çalışmaz. "$ USER" sudo tarafından sıfırlandı. Bunu mu demek istediniz: $ SUDO_USER Ayrıca, "[" yerine "[[" mi demek istediniz?
TomOnTime

1
örnek düzelttim. Temel olarak loginuid için kontrol 0 eşittir, ancak kullanıcı kök.
ruckc
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.