Sudo ön yetkilendirilsin mi? (Böylece daha sonra çalıştırılabilir)


3

Akşamları eve gitmeden önce iş bilgisayarımı sık sık zaman alan bazı işlemlerle çalıştırırdım. Onlar bittikten sonra kapanmasını istiyorum. Ancak kapat kök ayrıcalıkları gerektirir, sudo . Açıkçası, 7 saat sonra şifremi girmek için orada değilim, o ana kadar komutların tamamını (cmd1; cmd2; cmd3; ... kapatma) root olarak çalıştırmak zorunda kaldım - ideal değil.

Komut listesinin sonundaki sudoya "ön provizyon" yapabilmemin bir yolu var mı? Bir şekilde, şifremin tamamını yürütmenin başında bulabilirim, böylece bash daha sonra bana ihtiyaç duymaz?

Teşekkürler!


Bu etkinlikleri nasıl yürütüyorsunuz? Olayları ilk başta yapan şeyi söyleyemez misiniz? Komut dosyasının tamamını çalıştırmak istemediğinizi söylediniz kök Bu aynı zamanda tüm komut dosyasını sudo olarak çalıştırmayı da içeriyor mu?
Scott Chamberlain

1
"En iyi" eş olarak nitelendireceğin herhangi bir cevap gördün mü? Biri genellikle benzer bir sorunu olan başka birine yardım etmek için sorudaki en iyi cevabı işaretler.
PsychoData

Yanıtlar:


4

İlk cevabı tamamlamak için:

Ayrıcalıklı olmayan zaman alan hesaplamalarınızın, ayrıcalıklı kabukta bekleyen kapatmayı başlatabilmesi için bir yol ayarlayın. sudo -s veya sudo su ). Bir dosyayı bayrak olarak kullanmak, bunu yapmanın iyi ve basit bir yoludur. Öyleyse, ayrıcalıklı olmayan kabuğunda, yap

cmd1; cmd2; cmd3; > ok_to_shutdown_now

ve ayrıcalıklı kabuğunuzda yazan bir komut dosyasını çalıştırın

while [ ! -f ok_to_shutdown_now ]
do
        sleep 60
done
shutdown

Bu IMHO'nun en iyi çözümü. inotifywait, ok_to_shut dosyasının oluşturulmasını beklemek için kullanılabilir, ancak kapatma amacı için bu yeterli olmalıdır.
jaychris

Bu yaklaşımın benim için kurmaktan daha hızlı olduğunu kabul ediyorum. Ancak, uzun süre boyunca ayrıcalıklı bir program yürütmeyi gerektiriyor, bu da bu yaklaşımın daha az hoş bir yanı gibi görünüyor.
TOOGAM

2

Risk almak istediğinize bağlı olarak, hedefinize ulaşmak için burada birkaç seçeneğiniz var. Hepsi sizin sudo kimlik bilgilerinizi önbelleğe almakla ilgili değil.

Kullanıcınız için veya yürüten kullanıcı için bir şifreye ihtiyaç duyarak kapatabilirsiniz. shutdown etiketine bir satır ekleyerek NOPASSWD sudoers dosyanıza.

Çalıştırarak sudo kimlik doğrulaması yapabilirsiniz. sudo -v. Şifreniz 15 dakika süreyle önbellekte saklanır, böylece bir sudo -v hepsi, örneğin, 12 dakika içinde, kimlik bilgilerinizi güncellemek ve son toplu işlem yapıldıktan sonra bu görevi öldürmek için.

Toplu işlemlerinizin ne kadar sürdüğünü biliyorsanız, sadece shutdown Bundan sonra sistemi kapatması gerekir.

Bu seçenek ile şifre önbelleğinin varsayılan 15 dakikalık zaman aşımını artırabilirsiniz. timestamp_timeout sudoers dosyasında. İsteğe bağlı olarak veya toplu işlemlerin ne kadar sürdüğünü biliyorsanız, o zaman. Veya zaman aşımını tamamen negatif bir değerle kapatabilir ve kullanabilirsiniz. sudo -v kimliğini doğrulamak ve sudo -k bittiğinde sudo "oturumu kapat". Bu iki arama arasında koşabilirsiniz. sudo Şifrenizi tekrar girmeden

Sudo için bir şifre istemediğinizden emin değilseniz, bunun yerine şifrenizi sadece kullanıcı tarafından okunabilen bir metin dosyasında saklayın, o zaman şifrenizi çıkaran küçük bir toplu komut dosyası oluşturabilir ve bunu stdout için kullanabilirsiniz. sudo için program veya sadece bir boru içinde kullanın sudo -Sadlı şifreyi okuyan stdin. Küçük bir komut dosyası ile şifrenizi, başlangıçta bir metin dosyasında saklayabilirsiniz; sudo ve sonunda bu dosyayı tekrar silin.

Yankı betiği

#!/bin/bash
echo mypassword

veya

#!/bin/bash
cat /mysecretpwfile

ve sonra ./echopw | sudo -S veya

export ASKPASS=~/echopw
sudo -A shutdown -h now

Veya, sonunda, kapatma komutunu bir kabuk betiğine koyabilir ve kabuk betiğini suid, owner root, grubunuz 750 olarak ayarlayabilirsiniz.


Kimlik bilgisi önbelleğe almanın 15 dakika olduğunu söylüyorsunuz, ama " Unix ve amp; Linux: sudo önbelleğe alınmış bir komutu çalıştırmak için kullanılan şifre ne kadardır? "5 dakika diyor. Bu cevap faydalı olduğu için +1, Scott'un yaklaşımı (veya benimki) gibi bir şey daha iyi olsa da.
TOOGAM

1

Komutları bir kök ortamında çalıştırabilirsiniz; böylece, bilgisayardayken bir kez şifrenizi girip ardından root şifrenizi girmeden sonra komutları.

Kullanabilirsiniz

   sudo -s

veya

   sudo su

(oku İşte fark için)

Bu size kök ayrıcalıkları sağlayacak ve şifrenizi tekrar girmenizi engelleyecektir. Sonra, bundan sonra sudo komutlarını çalıştırabilirsin ve senden bir şifre sormazlar.


1

yapabilirdiniz

sudo sh -c 'cmd1; cmd2; cmd3;... shutdown'

veya kullanıcı adınıza parola olmadan kapatma işlemine izin verin. Burada sadece bunun için bir örnek var: Kök olmadan kapatma


Ben sudoers config için giderdim. Bu dosya oldukça uzun; İlgili örnek “Konsoldan Parola Olmadan Kapatılması” başlıklı bölümdedir.
rici

1

En iyi yol...

Evet, bunu yapmanın daha iyi bir yolu var. Kapatmanın süper kullanıcı ayrıcalıkları gerektirmemesini sağlayın.

Bu, önceden biraz kurulum gerektirir. Ardından, ayrıcalıklı eylemi kimin yapabileceğini ve bu yöntemi kullanan bir insanın ne yapabileceğini en aza indirir. (Başka bir deyişle, gücün potansiyel olarak kötüye kullanılması, mevcut bazı diğer sınırlamalar ile sınırlandırılmıştır.)

Bazı yaygın yazılımların yüklenmesini varsayacağım sudo (soruyu dikkate alarak güvenli bir varsayım gibi görünüyor) ve OpenSSH (veya muhtemelen "OpenSSH Portable").

Bir kullanıcı hesabı oluşturun

Göründüğünden beri sudo erişim, muhtemelen bir kullanıcı oluşturma yeteneğiniz olduğunu düşünüyorum.

Kullanıcıyı _sysstop veya _sysoff, vb. Olarak çağırmak isteyebilirsiniz. "Kapatma" sekiz karakter veya daha kısa olsa da, çalıştırılacak bir komutun adıdır, bu nedenle farklı bir ad kullanmak hoş olabilir. Ben de tam otomatik hesaplara, örneğin bunun gibi bir alt çizgi ile başlama standartlarını seviyorum, bu yüzden görsel olarak bu hesap standart bir kullanıcı hesabından farklı gözüküyor.

Kullanıcının şifre olmadan kapanmasına izin ver

/ Etc / sudoers dosyasını değiştirin ve şunu ekleyin:

_sysstop ALL=(ALL) NOPASSWD:/sbin/shutdown -h*, SETENV: ALL

Doğal olarak, oluşturduğunuz kullanıcı hesabının adı olan ilk bölümü özelleştirmek isteyebilirsiniz.

Birçok insan NOPASSWD kullanmaya karşı çıkıyor gibi görünüyor, çünkü muhtemelen sistemdeki hiçbir şeyi yapmak için tam erişim sağlama fikrinden hoşlanmıyorlar. Ancak, bu oldukça sınırlı erişim veriyor. Bu kişinin yapabileceği tek şey, sistemi durduracak "/ sbin / shutdown -h" ile başlayan bir komut çalıştırmaktır. Yetkisiz bir kişi bu hattan şifre olmadan yararlanmayı başarırsa, sistemi kapatabilirler, ancak bu, böyle bir saldırganın çok fazla başka tür hasar verebilecek şekilde sınırlandırılmayacağı anlamına gelmez. ek kullanıcı hesapları oluşturma, vb.) Bu nedenle, NOPASSWD'nin bu kullanımı çoğu insanın cesaretini kırmaya çalıştığının aksine oldukça güvenlidir.

"/ Sbin / shutdown -h" kullanmak istediğim şeydi. İşletim sisteminize ve ne istediğinize bağlı olarak, "durma" veya "yeniden başlatma" gibi farklı bir komut kullanmak isteyebilir ve farklı parametreler isteyebilirsiniz. Zaten sistemi istediğiniz gibi kapatma konusunda pratik yaptığınız için, muhtemelen bunu nasıl yapmak istediğinizi zaten biliyorsunuzdur.

Bir SSH anahtarı oluşturun

ssh-keygen -t rsa -vvv -f mykey -N "" -C "mykey" | tee mykey.fng

Bazı insanlar sevmeyecek -N "". Bu, bu ifadenin geri kalan kısmının ötesinde, burada daha fazla ilerlememeyi seçtiğim tamamen farklı bir tartışma: hangi güvenlik uygulamalarının sizi daha rahat hale getirdiğine göre özelleştirin.

Yukarıdaki örnekte, bazılarının tavsiye edebileceği başka değişiklikler olabilir. Yine, bu mükemmel olabilir, ancak bu cevabın özünden ayrı bir konudur. Yukarıdakileri uygun şekilde özelleştirin.

Yukarıdaki örnekte "mykey" ifadesinin üç kez göründüğüne dikkat edin. İlk örneği özelleştirmek için kesinlikle bekliyoruz, ve sonra diğer olaylar ilk oluşumun söylediği ile eşleşmek üzere tasarlandı.

Mykey.fng dosyasına ihtiyacınız yok. Bu tür anahtarların daha sonra tekrar görülebileceğini öğrenmeden önce, VisualHostKey (a.k.a. "rastgele-sanat") kaydını alabilmem için onu koruma alışkanlığına yeni başladım. "ssh-keygen -lvf / etc / ssh / ssh_host_ecdsa_key"

Anahtarla yapılabilecekleri kısıtla

Değiştirmek ~$( echo username-just-created )/.ssh/authorized_keys* dosya. (Örneğin., ~_sysstop/.ssh/authorized_keys bazı sistemler kullanabilse de ~_sysstop/.ssh/authorized_keys2, olmasına rağmen büyük olasılıkla onaylanmış tuşları kullanmak istiyorsun )

Dosyaya yaklaşık olarak benzeyen bir satır ekleyerek ssh anahtarını uygulayın:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAA... Optional-comment-after-the-space

"İsteğe bağlı-yorumdan sonra-boşluk" için, özel anahtarın dosya adını eklemeyi seviyorum. Ek bir anahtar eklemek istersem (ki bu belirli kullanıcı için olmayabilir, ancak alışkanlık dışı, bazı kullanıcılar ek anahtarlar isteyebilir), o zaman onaylanmış_ anahtarlar dosyası anahtarın metni tarafından tanımlanabilecek çok fazla satır içerebilir. . Birden fazla anahtarım varsa ve aylar sonra bir tanesini kaldırmak istersem, hangi ortak anahtarın hangi anahtar dosyayla ilişkili olduğunu hatırlamakta zorlanacağım ve bu yüzden hangi ortak anahtarın kaldırılacağını bilemeyeceğim. İsteğe bağlı yorumu kullanarak, bunu gelecekte daha iyi tutabilirim.

Not: anahtarı otomatik olarak eklerseniz (belki de ssh-add ile), belki bir kullanıcı adı içeren varsayılan bir yorumunuz olabilir. Bu tür yorumlar genellikle oldukça işe yaramaz. Yolda kullanılabilecek şekilde özelleştirin.

sağlamak ~/.ssh/authorized_keys OpenSSH’yi mutlu etmek için gerekli izinlere sahiptir.

Tek adımları test edin

Bunu test edebilir misiniz (sistemi kapatarak)? Eğer öyleyse, bunu yapmak bazı bileşenleri ayrı ayrı test edebilir, bu da bir şey kırılırsa daha daralmış bir problem yaşamanıza izin verebilir.

  • Anahtarın doğru ayarlandığını test edin.
    • İstemcide, kullan ssh -i ~/keys/privkey-file _sysstop@localhost
    • PuTTY kullanıyorsanız, PuTTY -i filename (ve -ssh ) veya sadece "Yeni Oturum" ekranında yapabileceğiniz Bağlantı \ SSH \ auth (seçeneklerin sol çerçevesinde) 'de dosya adını belirtmek için GUI'yi kullanın. (Özellikle, "yalnızca" diyorum çünkü PuTTY'nin "sistem menüsünü" ve mevcut bir oturumda "Oturumu değiştir" i kullanırken "auth" ekranı görünmüyor.)
    • Sürecin bu aşamasında, bu size bir kabuk vermelidir. Değilse, SSH tuşlarını kullanarak uygulamayı ayarlamanız gerekebilir.
  • Giriş yaptıktan sonra, sistemi kapatmak için sudo'nun çalıştığını (şifre olmadan) test edin.

Anahtarı kısıtla

Bakın ~/.ssh/authorized_keys* dosya? Harika. Şimdi değiştirin.

İle başlayan satırı bulun ssh-rsa

Bundan önce bir miktar metin ekleyin, böylece satır şöyle görünür:

command="sudo /sbin/shutdown -hp now Shutdown initiated with SSH by \\"$USER\\" CONN rem/lcl=\\"$SSH_CONNECTION\\" CLI rem/lcl=\\"$SSH_CLIENT\\" CMD=\\"$SSH_ORIGINAL_COMMAND\\"",no-agent-forwarding,no-port-forwarding,no-X11-forwarding ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAA... Optional-comment-after-the-space

Sonuç

Özel SSH anahtar dosyasını koru. Bununla, herkes sistemi kapatabilirdi. Ancak, gerçekten yapabildikleri budur.

Şimdi, sistemi kapatmak sadece "ssh" imzasız komutunu çalıştırmayı ve bu dosyaya erişmeyi gerektirir. Bu dosyaya erişimi kontrol ettiğiniz sürece, işleri olması gerektiği kadar güvende tutuyorsunuz. Bununla birlikte, dosya tehlikeye girse bile, yapılabilecek zarar miktarı oldukça sınırlıdır.

Artık sistemi kapatmak istediğinizde sudo yazmanıza bile gerek yok. Yetkisiz kimsenin bu anahtarı alamadığından emin olmanız gerekir (veya sistemi kapatabilirler). Muhtemelen bu dosyayı çalmak için "sudo" kullanabilen herhangi biri, sistemi kapatmak için sadece "sudo" yu da kullanabiliyordu, bu yüzden birçok durumda dosyayı bilgisayarın özel bir alanında bırakmak muhtemelen nispeten güvenli ve makul bir risktir.


-1

En kolay çözüm muhtemelen şifreyi bir değişkende saklamaktır ve daha sonra bu değişkene sudo -S.

#!/bin/bash
echo "Please enter your password:"
read -s mypasswd

#additional stuff

echo $mypasswd | sudo -S shutdown -h now

-1 çünkü: Kötü kötü. Komutu yankılama. Bazı sistemler oluşturulan her komutun bir günlük dosyasını oluşturacaktır. Şifre aynı zamanda "ps" de görünecektir (şüphesiz kısaca). Okuduğum şey, uzmanların bunun çoğu insanın kredi verdiğini düşündüğünden çok daha riskli olduğunu söylediği. (Çok daha iyisi, bir dosyaya şifre girmenin bir yolunu bulmak ve daha sonra bu dosyayı komut satırında belirtmektir.)
TOOGAM

@TOOGAM Bir bash betiğinin içinde çağrılan her komutu çözülmüş değişkenleri olan günlüğe kaydeden sistemler için herhangi bir referansınız var mı? Bunu hiç duymamıştım. biliyorum ps, ancak şifreyi diğer kişilerin daha uzun süre okuyabileceği bir dosyaya yazmaktan çok daha rahatım. Ancak şifre günlüklerde olsa bile benim ev bilgisayarımda bile istemeyeceğim bir şey olurdu.
Tim

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.