Soru ssh-agent yönlendirme ve başka bir kullanıcıya sudo


Eğer ssh anahtarımla giriş yapabileceğim bir sunucu A varsa ve "sudo su - otheruser" yeteneğine sahibim, env değişkenleri kaldırıldığı için anahtar yönlendirmeyi kaybederim ve Soket sadece orijinal kullanıcım tarafından okunabilir. Anahtar iletimini "sudo su - otheruser" ile köprüleyebileceğim bir yol var, bu yüzden bir iletiyi B iletilen anahtarımla (durumumda git clone ve rsync) bir şeyler yapabilirim?

Düşünebilmemin tek yolu, anahtarımı diğer kullanıcı ve "ssh otheruser @ localhost" adlı yetkili_keylerine eklemektir, ancak sahip olduğum her kullanıcı ve sunucu birleşimi için kullanışsızdır.

Kısacası:

$ sudo -HE ssh user@host
(success)
$ sudo -HE -u otheruser ssh user@host
Permission denied (publickey). 

144
2018-01-28 13:52


Menşei




Cevaplar:


Bahsettiğiniz gibi, ortam değişkenleri sudoGüvenlik nedeniyle

Ama ne yazık ki sudo oldukça yapılandırılabilir: tam olarak hangi ortam değişkenlerini korumak istediğinizi söyleyebilirsiniz. env_keep içinde yapılandırma seçeneği /etc/sudoers.

Aracı yönlendirmesi için SSH_AUTH_SOCK Çevre değişkeni. Bunu yapmak için sadece /etc/sudoers yapılandırma dosyası (her zaman visudo) ve env_keep uygun kullanıcılar için seçenek. Bu seçeneğin tüm kullanıcılar için ayarlanmasını istiyorsanız, Defaults bu gibi çizgi:

Defaults    env_keep+=SSH_AUTH_SOCK

man sudoers daha fazla ayrıntı için.

Artık böyle bir şey yapabilmelisiniz ( user1açık anahtarı şu anda mevcut ~/.ssh/authorized_keys içinde user1@serverA ve user2@serverB, ve serverA'ler /etc/sudoers dosya yukarıda belirtildiği gibi kurulur):

user1@mymachine> eval `ssh-agent`  # starts ssh-agent
user1@mymachine> ssh-add           # add user1's key to agent (requires pwd)
user1@mymachine> ssh -A serverA    # no pwd required + agent forwarding activated
user1@serverA> sudo su - user2     # sudo keeps agent forwarding active :-)
user2@serverA> ssh serverB         # goto user2@serverB w/o typing pwd again...
user2@serverB>                     # ...because forwarding still works

168
2018-03-03 21:24



Bu doğru cevap, işaretlenmelidir. - Xealot
Bu sadece çalışırsa user2 yukarıda root! Aksi takdirde, user2 SSH_AUTH_SOCK doğru şekilde ayarlanmış olacak, ancak user2 ör. / Tmp / SSH-GjglIJ9337 /. root Bu erişim var. Bu, sorunun bir kısmını çözebilir, ancak OP'leri çözemez: "ve soket sadece orijinal kullanıcım tarafından okunabilir " - Peter V. Mørch
Defaults>root env_keep+=SSH_AUTH_SOCK Sudoing yaparken sadece ileri doğru için kök. Bunu güvenlik nedenleriyle başka kullanıcılara yapmak istemezsiniz. Daha iyi bir taşeron için ayrı bir ssh-agent çalıştırın ve uygun anahtarları ekleyin. - Paul Schyska
sudo su - benim için çalışmaz, muhtemelen çevreyi koruyamaz çünkü sudo kabuk başlangıç ​​saatinde. sudo su çalışıyor gibi görünüyor. - Alex Fortuna
İnsanların neden kullandığını asla anlamadım sudo su neyse. Kök kabuğa ihtiyacınız varsa sudo -s veya sudo -i için. - eaj


sudo -E -s
  • -E çevreyi koruyacak
  • -s bir komut çalıştırır, varsayılan olarak bir kabuk

Bu, hala yüklenmiş orijinal anahtarlara sahip bir kök kabuk verecektir.


55
2018-01-01 15:31



Yukarıdaki yorumda olduğu gibi, bu sadece root olmanız halinde soruyu ele alır, çünkü bu durumda root $ SSH_AUTH_SOCK üzerindeki normal erişim izinlerini alabilir. - doshea


İzin vermek otheruser erişmek için $SSH_AUTH_SOCK dosya ve dizin, örneğin doğru ACL, onlara geçiş yapmadan önce. Örnek varsayılmaktadır Defaults:user env_keep += SSH_AUTH_SOCK içinde /etc/sudoers ana makinede:

$ ssh -A user@host
user@host$ setfacl -m otheruser:x   $(dirname "$SSH_AUTH_SOCK")
user@host$ setfacl -m otheruser:rwx "$SSH_AUTH_SOCK"
user@host$ sudo su - otheruser
otheruser@host$ ssh server
otheruser@server$

Daha güvenli ve kök olmayan kullanıcılar için de çalışır ;-)


33
2017-11-15 10:58



Bu yöntemi kullanırken, diğer kişilerin otheruser ssh kimlik doğrulamanızı da kullanabilir. - gitaarik
Bu benim için çalışır dışında "sudo su - otheruser" "sudo su otheruser" (- kaldırarak) değiştirmek zorunda kaldı. - Charles Finkel
Niye ya rwx ve yok rw (veya r hiç) - anatoly techtonik
@anatolytechtonik Gönderen man 7 unix - Sokete bağlanan Linux'ta bu sokette okuma ve yazma izinleri gerekir. Ayrıca, bu sokete bağlandığınızda soket oluşturduğunuz dizinde veya yürütme (yürütme) izninde arama (yürütme) ve yazma iznine ihtiyacınız vardır. Yani yukarıdaki cevap yürütme izni soketinde artık gereksizdir. - mixel


Bunun da işe yaradığını buldum.

sudo su -l -c "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK; bash"

Diğerlerinin de belirttiği gibi, geçiş yaptığınız kullanıcının $ SSH_AUTH_SOCK (root dışında hemen hemen her kullanıcı) üzerinde okuma izinleri yoksa bu işe yaramaz. Bunun için $ SSH_AUTH_SOCK ve girilen dizinin 777 izinlerini ayarlayarak bunu aşabilirsiniz.

chmod 777 -R `dirname $SSH_AUTH_SOCK`
sudo su otheruser -l -c "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK; bash"

Bu oldukça riskli olsa da. Temel olarak SSH Agent'ınızı (oturumunuzu kapatana kadar) kullanmak için sistemdeki her kullanıcıya izin veriyorsunuz. Ayrıca grubu ayarlayabilir ve izinleri daha güvenli olabilecek 770'e değiştirebilirsiniz. Ancak, grubu değiştirmeyi denediğimde "İzin verilmiyor" aldım.


16
2018-03-21 00:01



Bu son derece riskli. SSH aracınızı kullanmanız için diğer tüm kullanıcı iznini vermek, tüm kimlik bilgilerinizi vermekle eşdeğerdir (ve sudo veya su'yı kullanırsanız, sistemdeki tüm diğer kullanıcılara ve ayrıca ssh yaptığınız diğer sistemlere root gücü verirseniz!) . Bu ASLA yapılmamalıdır! - Matija Nalis
"Bu ASLA YAPILMAMALIDIR!" İfadesine katılmıyorum. Bu riskin kabul edilebilir olduğu birçok durum vardır. Örneğin, herkesin aynı izinlere sahip olduğu ve diğer tüm kullanıcılara güvendiğiniz küçük bir ekip. İçerdiği riskleri anlamadan asla yapılmamalıdır. Ancak bu riskler anlaşıldıktan sonra, riskin kabul edilebilir olduğu zamanlar vardır. - phylae


Yetkili iseniz sudo su - $USERo zaman muhtemelen bir ssh -AY $USER@localhost bunun yerine, $ USER ana dizinindeki geçerli genel anahtarınızla. Ardından, kimlik doğrulama iletiniz sizinle birlikte taşınır.


6
2018-01-28 14:08



Sorunun alt kısmında, bunun yapılması zor olacağını belirtti. - Fahad Sadah
Bu muhtemelen en iyi çözümdür ancak $ USER bir Gerçek Kişi ise (tm) kıllanırsa - SA'nın anahtarını authorized_keys'den silebilir veya parolalarını değiştirebilir ... - voretaq7
Yazma erişimini authorized_keys'e kaldırabilirsiniz (ancak eğer gerçekten Florian erişimini reddetmeye ayarlanmışlarsa, silebilir ve yeniden oluşturabilirler, sahip oldukları dizinde olabilirler) - Fahad Sadah


Her zaman sudo kullanmak yerine aracı yönlendirmesiyle localhost'a ssh yapabilirsiniz:

ssh -A otheruser@localhost

Dezavantaj, tekrar giriş yapmanız gerektiğidir, ancak eğer bir ekran / tmux sekmesinde kullanıyorsanız, bu sadece bir kerelik bir çabadır, ancak, eğer sunucu bağlantısını keserseniz, soket (elbette) tekrar kırılacaktır. . Ekran / tmux oturumunuzu her zaman açık tutamazsanız, bu ideal değildir (ancak, el ile SSH_AUTH_SOCKenv var, eğer havalıysanız).

Ayrıca, ssh iletimini kullanırken, kök her zaman sokete erişebilir ve ssh kimlik doğrulamanızı (ssh yönlendirmesiyle oturum açtığınız sürece) kullanabilir. Yani köküne güvenebileceğinden emin ol.


4
2017-11-27 14:56





Kullanma sudo su - USER, daha ziyade sudo -i -u USER. Benim için çalışıyor!


3
2018-01-28 16:51



Sudo'nun hangi versiyonuna sahipsiniz? Benimki (1.6.7p5, CentOS 4.8) kendi sayfasında -i bulunmuyor. - David Mackintosh
Sudo version 1.6.9p17 Debian Lenny'de koşuyor. Deneyin sudo -s? - Fahad Sadah
Benim için çalışmıyor.
Ubuntu'da, Sudo 1.8.9p5'i kullanarak ne sudo -s ne de sudo -i benim için çalış... - Jon L.


Bu konuda ortaya çıkan diğer cevaplardan gelen bilgileri birleştirdim:

user=app
setfacl -m $user:x $(dirname "$SSH_AUTH_SOCK")
setfacl -m $user:rwx "$SSH_AUTH_SOCK"
sudo SSH_AUTH_SOCK="$SSH_AUTH_SOCK" -u $user -i

Bunu beğendim çünkü düzenlemeye ihtiyacım yok sudoers dosya.

Ubuntu 14.04 üzerinde test edildi (yüklemek zorundaydı acl paketi).


2
2018-06-10 17:39





Ne yazık ki başka bir kullanıcıya (ya da sudo kullan) su verdiğinizde, yönlendirilmiş anahtarlarınızı kullanma yeteneğinizi kaybedersiniz. Bu bir güvenlik özelliğidir: ssh aracınıza bağlanan ve anahtarlarınızı kullanarak rasgele kullanıcıların istemesini istemez :)

"Ssh -Ay $ {USER} @localhost" yöntemi biraz hantaldır (ve David'in cevabı kırılmaya eğilimli benim yorumumda belirtildiği gibi), ama muhtemelen yapabileceğiniz en iyisidir.


1
2018-01-28 16:52



Hmm, ama bunu ssh ile yaparsam, o zaman ajanım yine de o kullanıcı tarafından erişilebilir mi, yoksa yanlış mıyım?
Ajan iletme ile hedef kullanıcıya SSH gönderirseniz, aracı talepleriniz zinciri "gerçek" temsilci olduğu yere geri döndürür. Orijinal kullanıcıdan ayrıldığınızda ya da sudo olduğunuzda, SSH ajan soketiniz erişilebilir olmayacaktır (ya da erişilmemelidir) - Yaşadığı dizin, mod 700'dür ve orijinal kullanıcıya aittir. (Açık Caveat: Eğer root'a geçiş yapıyorsanız ve SSH_AUTH_SOCK ortamını sıfırlarsanız işe yarayabilir, ancak buna güvenmeyeceğim) - voretaq7
Sunucumda (Ubuntu 12.04, ssh sürümü OpenSSH_5.9p1 Debian-5ubuntu1.1, OpenSSL 1.0.1 14 Mar 2012), ssh -a ve -A argümanlar. -a Neyin amaçlandığını tam tersi, ajan yönlendirmeyi devre dışı bırakır! Yani, Ubuntu'nun (muhtemelen ve muhtemelen) yeni sürümünde, -A Aracı yönlendirmeyi etkinleştirmek için - knite
@knite Doğru - cevabımdaki (3 yaşında bir) yazım hatası budur. Şimdi düzeltildi :-) - voretaq7


Sanırım bir sorun var. - sonra (dash) seçeneği su senin emrinde:

sudo su - otheruser

Eğer man sayfasını okursanız su, seçeneği bulabilirsin -, -l, --login kabuk ortamını giriş kabuğu olarak başlatır. Bu çevre için olacak otheruser Çalıştığınız env değişkenlerinden bağımsız olarak su.

Basitçe söylemek gerekirse, tire geçmişten gelen her şeyi zayıflatacaktır. sudo.

Bunun yerine, şu komutu denemelisiniz:

sudo -E su otheruser

@ Joao-costa'nın işaret ettiği gibi, -E koştuğunuz ortamdaki tüm değişkenleri koruyacaktır sudo. Sonra çizgi olmadan su Bu ortamı doğrudan kullanacaktır.


0
2018-04-05 10:03