“Sudo su -” içindeki komutlar nasıl günlüğe kaydedilir?


12

Eğer ben:

[user@notebook ~] sudo echo 123456uu
123456uu
[user@notebook ~] 

Sonra bunu günlüklerde görebiliyorum:

[root@notebook /var/log] grep 123456uu *
auth.log:Jan  9 17:01:51 notebook sudo: user : TTY=pts/3 ; PWD=/home/user ; USER=root ; COMMAND=/bin/echo 123456uu
[root@notebook /var/log] 

ama eğer ben:

[user@notebook ~] sudo su -
[root@notebook ~] echo 1234567zz
1234567zz
[root@notebook ~] 

Günlüklerde göremiyorum:

[root@notebook /var/log] grep 1234567zz *
[root@notebook /var/log] echo $?
1
[root@notebook /var/log] 

Benim sorum: "sudo su -" içindeki komutlar için günlük kaydını nasıl açabilirim?

İşletim sistemi bir Ubuntu 12.04 ama genel olarak soru.

GÜNCELLEME # 1:

[user@notebook ~] sudo su -
[sudo] password for user: 
[root@notebook ~] echo zizizi
zizizi
[root@notebook ~] cd /var/log
[root@notebook /var/log] grep -iIR 'zizizi' *
[root@notebook /var/log] grep 'COMMAND=/bin/su -' *
auth.log:Jan 10 15:42:42 notebook sudo: user : TTY=pts/1 ; PWD=/home/user ; USER=root ; COMMAND=/bin/su -
[root@notebook /var/log]

Kötü niyetli (hatta güvenilmez) birisinin erişimi sudo su -varsa, eylemleri için yapabileceğiniz tüm günlük girdilerini kaldırma olanağına da sahiptir. Günlüğe kaydetmenizde% 100 kesinlik istiyorsanız, sudoçok kısıtlamanız ve sudo sutamamen izin vermemeniz gerekir.
Wildcard

Yanıtlar:


17

Ubuntu 12.04'te olduğunuz için, log_inputve log_outputseçenekleri aracılığıyla etkinleştirilen G / Ç günlüğü yeteneklerine bir göz atın .

log_input

    Ayarlanmışsa, sudokomutu sözde tty'de çalıştırır ve tüm kullanıcı girişlerini günlüğe kaydeder. G / Ç yönlendirmesi nedeniyle veya komut bir ardışık düzenin parçası olduğundan, standart girdi kullanıcının tty'sine bağlı değilse, bu girdi de ayrı bir günlük dosyasında yakalanır ve saklanır.

    Giriş, iolog_dirseçenekle belirtilen dizine ( /var/log/sudo-iovarsayılan olarak), normal sudo günlük satırında yer alan ve öneki eklenmiş benzersiz bir oturum kimliği kullanılarak kaydedilir TSID=. Bu iolog_fileseçenek, oturum kimliğinin biçimini kontrol etmek için kullanılabilir.

    Kullanıcı girişinin, şifrelenmemiş günlük dosyasında depolanacak olan şifreler (ekrana yansıtılmamış olsalar bile) gibi hassas bilgiler içerebileceğini unutmayın. Çoğu durumda, komut çıkışının log_output yoluyla kaydedilmesi tek gereken şeydir.

log_output

    Ayarlanmışsa, sudokomutu sözde tty'de çalıştırır ve script (1) komutuna benzer şekilde ekrana gönderilen tüm çıktıları günlüğe kaydeder. G / Ç yönlendirmesi nedeniyle veya komut bir ardışık düzenin parçası olduğundan, standart çıktı veya standart hata kullanıcının tty'sine bağlı değilse, bu çıktı da ayrı günlük dosyalarında yakalanır ve saklanır.

    Çıktı, iolog_dirseçenekle belirtilen dizine ( /var/log/sudo-iovarsayılan olarak), normal sudo günlük satırında bulunan ve ön ekiyle benzersiz bir oturum kimliği kullanılarak kaydedilir TSID=. Bu iolog_fileseçenek, oturum kimliğinin biçimini kontrol etmek için kullanılabilir.

    Çıkış günlükleri, kullanılabilir günlükleri listelemek veya aramak için de kullanılabilen sudoreplay (8) yardımcı programıyla görüntülenebilir.

UYGULAMA: En az Sudo versiyonu: 1.7.4p4 gerekli.

/etc/sudoersmodifcation: Tüm yapmanız gereken gerekli sudoer girişlerine iki etiket eklemek (burada "su" komut veya takma adla belirtilir). LOG_INPUT ve LOG_OUTPUT.

Misal:

%admins         ALL=(ALL) NOPASSWD: LOG_INPUT: LOG_OUTPUT: ALL

Aşağıdaki varsayılan günlük dizini yapısını ekleyin sudoers:

Defaults iolog_dir=/var/log/sudo-io/%{user}

harika, ama eski sistemlerde çalışmıyor ..: \
newuser999

Evet, geçerli bir sudo versiyonunun bir paketini oluştur ya da sistemi yükselt.
Martin M.

13

Sizin grepyapıyor sudo su -çalıştırmakta değil çünkü başarısız echo 1234567zz, yayınladığınız su -, hangi lansmanları bir kabuk. Kabuk daha sonra senin çalışıyor echo.

Bu kasıtlıdır ve her komut çalıştırmasının günlüğe kaydedilmesi sistem günlüğünüzü işe yaramaz bilgilerle doldurur (genellikle normalde görmediğiniz sahnelerin arkasında çalışan tonlarca program vardır).

Eğer grep'inizi değiştirirseniz grep 'COMMAND=/bin/su -' *göreceksiniz.


sudo su -aynı zamanda yararsız bir kullanımdır su. sudo -iaynı şeyi yapar.


ama "sudo su -" 'yu ​​nasıl kaydedebilirim?
newuser999

1
Günlüğe kaydedilir. Denediniz mi grep 'COMMAND=/bin/su -' *(veya olmadan joker: grep 'COMMAND=/bin/su -' /var/log/auth.log)?
Patrick

Soruyu güncelledim. başka ne "sudo su -" kullanırken komutları günlüğe kaydedilmemiştir kanıtlamak zorunda?
newuser999

4
Komutu ( sudo -) olduğu kaydedilir ve güncellenmiş çıktı bu gösterir. Burada bahsettiğimiz tek şey bu. Diğer komutlar, örneğin echosize kullanıcılara geçiş sonrasında sudo -, olmayan komutlar Sudo, Giriş yapmadınız (cevabım göre) dolayısıyla ve auth.log. Yalnızca açıkça ön sırada yer alan ayrı komutlar sudogünlüğe kaydedilir. Bu yüzden sudo echogünlüğe kaydedilir, ancak echosüper kullanıcıya geçtiğinizden bağımsız olarak sadece düz değildir.
goldilocks

12

Artan karmaşıklık, "sudo su -" içinde verilen komutları kaydetmenin üç yolu:

  1. Bash komut geçmişine güvenin
  2. Yürütme günlüğü sarmalayıcısı yükleme
  3. SELinux'un denetimini kullan

Hangisine uygun olduğu, gerçekten günlük kaydı ile ne yapmaya çalıştığınıza bağlıdır.

1) Bash Komut Geçmişi

Farklı oturumlardan üzerine yazmamak, komutları ve uygun zaman damgalarını göz ardı etmemek için yeterli satır tutmayı sağlamak için geçmiş özelliğini yapılandırmak istersiniz. (Bkz. Bash kılavuzundaki HIST * değişkenleri ). Geçmiş dosyasını düzenleyerek, ortamı değiştirerek veya başka bir kabuk çalıştırarak kolayca altüst olur.

2) sarıcı yürütmek

snoopylogger biridir. /etc/profileGünlükçü kitaplığının işlemin bellek haritasında ( /proc/<pid>/maps) olduğunu kontrol edin ve yoksa, ayarlayın LD_PRELOADve yeniden başlatın (ile exec $SHELL --login "$@"). Alternatif olarak , snoopy.so'nun 32/64-bit sürümlerinize /etc/ld.so.preload ile $LIB/snoopy.soveya eşdeğer yollara bir giriş ekleyebilirsiniz.

Daha zor olsa LD_PRELOADda, yukarıdakilerin ortam değişkeni sürümü, yürütme ortamını manipüle ederek alt üst edilebilir, böylece snoopy kodu artık çalışmaz.

İçeriklerin güvenilir olması için sistem günlüğü kutudan çıkarılmalıdır.

3) Denetim

Yapılandırma sarmalayıcıdan biraz daha basit yapılandırılır, ancak bilgileri çıkarmak daha zordur. Bu gerçekten sorduğunuz sorunun cevabıdır: "Kullanıcının yayınladıktan sonra bir sistem üzerindeki etkisini kaydetmenin bir yolu var mı? sudo su -" İçeriklerin güvenilir olması için sistem günlüğü kutudan çıkarılmalıdır.

Bu Serverfault yanıtı , auditd ile kullanım için oldukça kapsamlı bir yapılandırma gibi görünmektedir.

Benzer bir soruya serverfault üzerinde başka öneriler de var .


9

Neden?

Çünkü bu sudogünlük kaydını yapıyor; sudo commmands günlüğe kaydeder. İlk durumda, sudo echogünlüğe kaydedilir. İkinci durumda, sudo sugünlüğe kaydedilir (arayın /var/log/auth.log).

su"kullanıcı değiştir", varsayılan olarak root'tur. Bundan sonra yaptığınız hiçbir şey geçmez sudo. Kök olarak oturum açmış gibisiniz; girişin kendisi günlüğe kaydedilir, ancak her komut değil.


5

Diğerlerinin söylediği gibi, sudobunu yapamazsınız.

Bunun yerine kullanın auditd. Kök tarafından yapılan her şeyi (örneğin crontab tarafından yapılanlar dahil) günlüğe kaydetmek istiyorsanız , bunu kullanın:

sudo auditctl -a exit,always -F euid=0

ETA: Her şeyi günlüğe kaydetmenin performansı etkileyeceğini unutmayın, bu nedenle muhtemelen biraz sınırlamak isteyeceksiniz. man auditctlÖrnekler için bakınız .

Yalnızca orijinal giriş uid'inin root olmadığı sistem çağrılarını kaydetmek istiyorsanız, bunun yerine şunu kullanın:

sudo auditctl -a exit,always -F euid=0 -F auid!=0

Günlükler genellikle /var/log/audit/audit.log biçiminde olur. Bunları ile arayabilirsiniz ausearch.

Orada man sayfasinda daha fazla bilgi verilmiştir auditctl, audit.rulesve ausearch.


2
Oh, denetim günlüklerinin güvenilir olması için ayrı bir sunucuya gönderilmelidir. Güvenilmeyen bir kullanıcının kökü olan makinede bulunan günlüklere güvenilemez.
Jenny D

o zaman bile güvenliği ihlal edilmiş bir sunucudan gelen veya olmayan şeylere güvenemezsiniz.
Matt

Ancak, ele geçirildiği zamana kadar bir iziniz olacak.
Jenny D

2
Op'un durumunda olan, teknik olarak koşar koşmaz teknik olarak sudo su -bu yüzden ilk kareye geri döndünüz
Matt

Güvenilmeyen, tehlikeye atılanla aynı değildir. Uzak sunucudaki denetim günlüğünün size ne yapıldığını ve kim tarafından - devre dışı bırakılmış denetimin kim olduğu da dahil olmak üzere - size göstereceği kötü bir şey yapana kadar taviz verilmez. Ve bunun dışında bile, bir kişi yerel günlüğü yanlışlıkla sildiğinde veya bir hata için kendini suçlamadan koruduğunda uzak bir günlük yardımcı olacaktır.
Jenny D

2

sudo su -~/.bash_historyEğer kabuğunuz bash ise olacak .

echo 1234567zz/root/.bash_historykök kabuğunun bash olması durumunda olacaktır .

Bunun açıklaması zaten goldilocks tarafından gönderildi.


2

Su'nun bir güvenlik açığı olduğunu düşündüğünüz için oturum açmasını ister misiniz? Bu komutu düşündün mü? sudo bashtıpkı kötü imho gibi.

İnsanların sudo ile neler yapabileceğinden endişe ediyorsanız, kullanımını kısıtlamanız gerekecektir. Ayrıca yürütebilecekleri komutları da kısıtlayabilirsiniz. Sizi endişelendiriyorsa / bin / su dosyasına erişimi kısıtlayın.


1

Peki buna ne dersin:

export HISTTIMEFORMAT="%d/%m/%y %T "
export PROMPT_COMMAND='builtin history 1 >> /var/log/sudo.log'
sudo -E su
unset PROMPT_COMMAND

veya

export HISTTIMEFORMAT="%d/%m/%y %T "
export PROMPT_COMMAND='builtin history 1 >> /var/log/sudo.log' 
sudo -E su --preserve-environment -
unset PROMPT_COMMAND

veya uzun bir astar:

HISTTIMEFORMAT="%d/%m/%y %T " PROMPT_COMMAND='builtin history 1 >> /var/log/sudo.log' sudo -E su

sudo -E ortamı korur PROMPT_COMMAND her komut isteminden önce yürütülür


birincisi bana bir konsol vermez VE ikincisini /root/.bashrc'ye koyarsam o zaman "sudo su -" dan sonra kök konsolunu almak istiyorsam CTRL + C tuşlarına basmam gerekir: D herhangi bir şans düzeltmek için (veya "tarih" işlevi eklemek için?). Çok teşekkürler!
14:49

Korktunuz yanlış kullandınız. Daha açık hale getirmek için düzenledi.
Costa

1

Bu yardımcı olursa, sudoerların "NOEXEC" seçeneğini kullanabilirsiniz.

Olarak tanımlamanız gerekir

USER_NAME         ALL=(ALL) NOEXEC : ALL

Bu, kabuk kaçışlarını önler ve kullanıcı sudo -i veya sudo -s veya sudo su kullanamaz -

Bu bir dezavantaj ile birlikte gelir, ancak Herhangi bir kabuk kaçışı devre dışı bırakılır. betiğin bir betiğin içinden yürütülmesi de reddedilecektir.


0

Bunu karmaşık hale getirmeyelim: Ne zaman sudoçağrılırsa, bu gerçeği bazı /var/logsistemlerde (sisteminizde, auth.logOS X kutumda) rapor eder system.log. sudokomut satırı argümanlarını rapor eder, ancak etkileşimli bir komutta neler olabileceği hakkında hiçbir bilgisi yoktur su.

Bu, bir kök alt kabuğunda ne olduğuna dair bir kayıt olmadığı anlamına gelmez: Kabuk komutları kabuğun geçmişine kaydedilir. Sistemimde, kökün geçmiş tasarrufu varsayılan olarak etkindir, bu yüzden tek yapmam gereken ~root/.sh_historyne yapıldığına dair bir kayıt aramaktır (birisi elbette kurcalamadığı sürece, ancak eşit derecede kurcalanabilirler /var/log).

Bunun sizin için en iyi çözüm olduğunu düşünüyorum . Değilse, auditd@Jenny'nin önerdiği gibi, şehre gidin .

PS. Kökün geçmişi zaten etkin değilse, etkinleştirilmesi hangi kabuğun kullanıldığına bağlıdır. İçin bash, ayarlayın HISTORYve HISTFILESIZEyeterince büyük bir sayıya (varsayılan 500, kılavuzum diyor). İsterseniz HISTFILEbir yola ayarlayarak geçmişin nereye kaydedileceğini belirleyebilirsiniz (varsayılan $HOME/.sh_history)


0

Oturumunuzu kullanarak aşağıdakileri kullanarak bir daktilo yazısı oluşturmak isteyebilirsiniz script(1):

$ sudo su -
# script -t /tmp/my_typescript 2> /tmp/my_typescript.timing
Script started, file is /tmp/my_typescript
# echo foobar
foobar
# echo hello world
hello world
# exit
exit
Script done, file is /tmp/my_typescript

Şimdi şunları yapabilirsiniz grep( #istemlerin gerçekten kaydedildiğine dikkat edin /tmp/my_typescript):

$ grep echo /tmp/my_typescript
# echo foobar
# echo hello world

Alternatif olarak, aşağıdaki oturumun tamamını tekrar izleyebilirsiniz scriptreplay(1):

$ scriptreplay -t /tmp/my_typescript.timing /tmp/my_typescript

/tmp/my_typescript.timingHer komut çağrıldığında dosya bilgiler içerir. Daha fazla zil ve ıslık olan ttyrecya da daha fazla araç shelrvar.

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.