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


153

Eğer ssh anahtarımla giriş yapabileceğim bir A sunucusuna sahipsem ve "sudo su - otheruser" yeteneğine sahipsem, anahtar yönlendirme özelliğini kaybediyorum, çünkü env değişkenleri kaldırılmış ve soket sadece orijinal kullanıcı tarafından okunabiliyor. Anahtar iletmeyi "sudo su - otheruser" üzerinden köprüleme yapmamın bir yolu var, bu yüzden bir sunucu B'de iletilen anahtarımla (durum klonumda git klonu ve rsync) bir şeyler yapabilirim?

Düşünebilmemin tek yolu, anahtarımı diğer kullanıcı ve "ssh otheruser @ localhost" 'nin anahtarlarına eklemektir, ancak sahip olduğum her kullanıcı ve sunucu birleşimi için yapması zor.

Kısacası:

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

Yanıtlar:


182

Bahsettiğiniz gibi, ortam değişkenleri sudogüvenlik nedeniyle kaldırılmıştır .

Ancak neyse ki sudooldukça yapılandırılabilir: env_keepYapılandırma seçeneği sayesinde hangi ortam değişkenlerini korumak istediğinizi tam olarak söyleyebilirsiniz /etc/sudoers.

Aracı iletme için, SSH_AUTH_SOCKortamı değişken tutmanız gerekir . Bunu yapmak için, /etc/sudoersyapılandırma dosyanızı düzenleyin (her zaman kullanıyorsanız visudo) ve env_keepseçeneği uygun kullanıcılara ayarlayın. Bu seçeneğin tüm kullanıcılar için ayarlanmasını istiyorsanız, aşağıdaki Defaultsgibi satırı kullanın :

Defaults    env_keep+=SSH_AUTH_SOCK

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

Artık (sağlanan böyle bir şey yapmak gerekir user1'mevcuttur ler genel anahtarını ~/.ssh/authorized_keysiçinde user1@serverAve user2@serverBve serverA' nin /etc/sudoersdosya yukarıda belirtildiği gibi kurulduğundan):

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

1
Bu doğru cevap, işaretlenmelidir.
Xealot

41
Bu sadece , eğer user2yukarıdaki ise işe yarar root! Aksi takdirde, user2SSH_AUTH_SOCK doğru şekilde kurulur, ancak user2örneğin / tmp / ssh-GjglIJ9337 /. rootbu erişime sahip değil. Bu, sorunun bir kısmını çözebilir, ancak OP'leri çözemez: " ve soket yalnızca asıl kullanıcım tarafından okunabilir"
Peter V. Mørch

6
Defaults>root env_keep+=SSH_AUTH_SOCKSadece ileriye sudoing zaman emin olmalısınız için root. Güvenlik nedenleriyle bunu zaten diğer kullanıcılara yapmak istemezsiniz. Daha iyisi için ayrı bir ssh-agent kullanın ve uygun anahtarları ekleyin.
Paul Schyska,

1
sudo su -benim için işe yaramıyor, muhtemelen çevreyi koruyamıyor çünkü sudokabuk başlangıç ​​zamanı değil. sudo suiş gibi görünüyor.
Alex Fortuna

3
İnsanların neden kullandığını asla anlamadım sudo su. Bir kök kabuğuna ihtiyacınız varsa, bunun için sudo -sya da sudo -ibunun için.
eaj

68
sudo -E -s
  • -E çevreyi koruyacak
  • -s bir komutu çalıştırır, varsayılan olarak bir kabuğa

Bu, orijinal anahtarlar hala yüklü olan bir kök kabuğu verecektir.


2
Yukarıdaki yorumda olduğu gibi, bu sadece root olmanız durumunda soruyu cevaplar, çünkü bu durumda root $ SSH_AUTH_SOCK üzerindeki normal erişim izinlerini aşabilir.
doshea

35

Diğer kullanıcılara$SSH_AUTH_SOCK dosyaya ve dizinine, örneğin doğru ACL'ye, onlara geçmeden önce erişmesine izin verin . Örnek varsayar Defaults:user env_keep += SSH_AUTH_SOCKiçinde /etc/sudoersana 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$

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


6
Bu yöntemi kullanırken, giriş yaptığınız diğer kişilerin otheruserde ssh onayınızı kullanabileceğini unutmayın.
gitaarik

Bu benim için çalışıyor, "sudo su - otheruser" ı "sudo su otheruser" olarak değiştirmek zorunda kalmam dışında (-).
Charles Finkel

1
Neden rwxve olmasın rw(veya rhiç)?
anatoly techtonik 21:14

3
@anatolytechtonik Kimden man 7 unix- Linux'un sokete bağlanması, bu sokette okuma ve yazma izinleri gerektirir. Ayrıca, soketi oluşturduğunuz dizinde arama (yürütme) ve yazma iznine veya bu sokete bağlandığınızda yalnızca arama (yürütme) iznine ihtiyacınız vardır. Yani yukarıdaki cevapta soket üzerinde yürütme izni gereksizdir.
mixel

/ etc / sudoers düzenlemek yerine kullanmak isteyebilirsinizsudo -u otheruser --preserve-env=HOME -s
Sec

14

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ı $ SSH_AUTH_SOCK (kökten başka bir kullanıcı değil) üzerinde okuma izinlerine sahip değilse bu işe yaramaz. Bunu $ SSH_AUTH_SOCK ve izinleri almak için bulunduğu dizinde 777 ayarlayarak halledebilirsiniz.

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

Bu olsa oldukça riskli. Temel olarak, diğer tüm kullanıcılara, SSH Temsilcinizi kullanmak için sistemden izin verin (çıkış yapana kadar). Ayrıca grubu ayarlayabilir ve izinleri 770 olarak değiştirebilirsiniz; bu daha güvenli olabilir. Ancak grubu değiştirmeyi denediğimde "İşleme izin verilmedi" aldım.


6
Bu son derece riskli. Diğer tüm kullanıcılara SSH aracınızı kullanma iznini vermek, onlara tüm kimlik bilgilerinizi vermekle eşdeğerdir (ve sudo veya su kullanıyorsanız, sistemdeki diğer tüm kullanıcıların yanı sıra, ssh ettiğiniz diğer sistemlerin hepsine de kök gücü verin!) . Bu ASLA ASLA yapılmamalıdır!
Matija Nalis

4
"Bu asla ASLA yapılmamalı!" İ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 bir kez anlaşıldığında, riskin kabul edilebilir olduğu zamanlar vardır.
phylae

6

Yetkili olursanız sudo su - $USER, o zaman ssh -AY $USER@localhost$ USER'ın ana dizinindeki geçerli ortak anahtarınızla, bunun yerine izin verildiğine dair iyi bir argümanınız olur . Ardından, kimlik doğrulama iletmeniz sizinle birlikte gerçekleştirilir.


Sorunun altında bundan bahsetti ve bunu yapmanın zor olacağını söyledi.
Fahad Sadah

Muhtemelen en iyi çözüm budur, ancak eğer $ USER Gerçek Kişi ise (tm) kıllı hale gelir - SA'nın anahtarını yetkili anahtarlardan silebilir veya şifrelerini değiştirebilirler ...
voretaq7

Yetkili_keylere yazma erişimlerini kaldırabilirsiniz (eğer gerçekten Florian erişimini reddetme konusunda ayarlanmış olsalar bile, silme ve yeniden oluşturabilirler, kendi dizinlerinde olurlar)
Fahad Sadah

4

Sudo kullanmak yerine her zaman aracı yönlendirme ile localhost öğesine ekleyebilirsiniz:

ssh -A otheruser@localhost

Dezavantajı, tekrar giriş yapmanız gerekmesidir, ancak eğer bir ekran / tmux sekmesinde kullanıyorsanız, bu sadece bir kerelik bir çabadır, ancak sunucudan ayrılırsanız soket tekrar kırılır . Bu nedenle, ekran / tmux oturumunuzu her zaman açık tutamazsanız ideal değildir (ancak, SSH_AUTH_SOCKeğer env var cihazınızı manüel olarak güncelleyebilirsiniz ).

Ayrıca, ssh yönlendirme kullanıldığında, root her zaman soketinize erişebilir ve ssh kimlik doğrulamanızı kullanabilir (ssh yönlendirme ile giriş yapmış olduğunuz sürece). Öyleyse köküne güvenebileceğinden emin ol.


Sadece erişimi varsa, bu işe yaramaz otheruseraracılığıyla sudoyerine SSH üzerinden (örn SCP şeyler istediğim gibi www-data)
Gert van den Berg

3

Kullanmayın sudo su - USER, aksine sudo -i -u USER. Benim için çalışıyor!


Hangi sudo versiyonunuz var? Mine (1.6.7p5, CentOS 4.8) man sayfasında -i yoktur.
David Mackintosh

Sudo version 1.6.9p17Debian Lenny üzerinde çalışıyor. Dene sudo -s?
Fahad Sadah

6
Benim için çalışmıyor.

Ubuntu'da Sudo 1.8.9p5 kullanıyor, ne benim için sudo -sde sudo -içalışıyor , ne de ...
Jon L.

2

Bununla karşılaştığım diğer cevaplardan gelen bilgileri birleştirerek:

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ü sudoersdosyayı düzenlememe gerek yok .

Ubuntu 14.04 üzerinde test edildi ( aclpaketi kurmak zorunda kaldı ).


1

Komutunuzdan -sonra (tire) seçeneğinde bir sorun olduğunu düşünüyorum su:

sudo su - otheruser

Su man sayfasını okursanız, seçeneğin -, -l, --loginkabuk ortamını giriş kabuğu olarak başlattığını görebilirsiniz. Bu, otheruserkoştuğunuz env değişkenleri ne olursa olsun çevrede olacak su.

Basitçe söylemek gerekirse, çizgi sizin geçtiğiniz her şeyi baltalayacaktır sudo.

Bunun yerine, bu komutu denemelisiniz:

sudo -E su otheruser

@ Joao-costa'nın işaret -Eettiği gibi, koştuğunuz ortamdaki tüm değişkenleri koruyacaktır sudo. Daha sonra kısa çizgi olmadan, subu ortamı doğrudan kullanacaktır.


0

Maalesef başka bir kullanıcıya dava açtığınızda (hatta sudo kullanıyorsanız) yönlendirme tuşlarınızı kullanma yeteneğinizi kaybedersiniz. Bu bir güvenlik özelliğidir: Rasgele kullanıcıların ssh-ajanınıza bağlanmalarını ve anahtarlarınızı kullanmalarını istemezsiniz :)

"Ssh -Ay $ {USER} @localhost" yöntemi biraz zahmetlidir (ve David'in kırılmaya yatkın cevabı üzerine yaptığım yorumda da belirtildiği gibi), ancak muhtemelen yapabileceğiniz en iyisidir.


1
Hmm, ama eğer bunu ssh ile yaparsam, ajanıma yine de bu kullanıcı tarafından erişilebilir mi, yoksa yanlış mıyım?

Ajansı yönlendiren aracıyla hedef kullanıcıya SSH yaparsanız, aracı taleplerinizi "gerçek" aracının olduğu yere kadar zincir sekecektir. Orijinal kullanıcıdan uzak durduğunuzda veya sudo olduğunuzda, SSH ajanı soketinize erişilemez (veya olmamalıdır) - Yaşadığı dizin, 700 moduna geçer ve orijinal kullanıcıya aittir. (Belirgin Caveat: Eğer SSH_AUTH_SOCK ortamını köklendirmek ve sıfırlamak için geçiş yapıyorsanız, işe yarayabilir, ancak buna güvenmemeliydim)
voretaq7

1
Sunucumda (Ubuntu 12.04, sSS sürüm OpenSSH_5.9p1 Debian-5ubuntu1.1, OpenSSL 1.0.1 14 Mart 2012), ssh var -ave -Aargümanlar. -aamaçlananın tam tersini yapar, aracı yönlendirmeyi devre dışı bırakır! Bu nedenle, Ubuntu'nun en yeni (ve muhtemelen tümü) sürümü altında, -Aaracı iletmeyi etkinleştirmek için kullanın .
knite

@knite Haklısın - cevabımdaki (3 yaşında!) bir yazım hatası. Şimdi düzeltildi :-)
voretaq7
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.