bağlantı ile ilgili bilgileri ssh istemcisinden ssh sunucusuna aktarma


1

farz edelim ki şu ssh oturumum var:

userA@boxA -> userB@boxB -> userC@boxC

Şimdi, gelen boxCgibi userC, ben ssh bağlantısı geldiğini bilgi sahibi olmak istiyorum userB@boxBsırayla gelen hangi userA@boxA.

Şimdi ilk ssh oturumu ile birlikte aşağıdaki ssh oturumu var:

userD@boxD -> userB@boxB

dan boxBolarak, userBben bağlantı geldiğini bilgi sahibi olmak istiyorum userD@boxDve gelen ikinci bir ssh oturumu olduğunu userA@boxA.

Bu bilgi kullanıcı olarak mevcut mu ve erişilebilir mi? Hiç mevcut mu?

değilse, bu bilgiyi kullanıma sunmanın "kolay" bir yolu var mı? Kolayca sshd'yi hacklemeden ve yeniden derlemeden ve makinelere kök erişimi vermek zorunda kalmadan demek istiyorum.


Yanıtlar:


2

Ortam değişkenlerini istemciden sunucuya göndermenin resmi yolu ise SendEnvve 'dir AcceptEnv. Sorun, yapılandırmak için sunucuda kök erişimine ihtiyacınız olmasıdır AcceptEnv. Çoğu sunucu önceden tanımlanmış bir veya daha az sayıda değişken kabul edecek şekilde yapılandırılmıştır.

İstemciden sunucuya ortam değişkenleri göndermek için iki püf noktası buldum, ikisi de sunucuda kök erişimine ihtiyaç duymadan çalışıyor.

bir numara:

ssh -t server SSH_ORIGIN=$USERNAME@$HOSTNAME bash

Bu sunucuya bağlanmak ve sonra komutu yerine getirecektir SSH_ORIGIN=$USERNAME@$HOSTNAME bashile, $USERNAMEve $HOSTNAMEzaten istemci tarafında yerini aldı. daha sonra, sunucu tarafında, değişkende bulunan bilgileri daha da işleyebilirsiniz SSH_ORIGIN.

-ttabi aksi bash (göreceksiniz deneyin) uçbirimlerden olmadan sunucu üzerinde başlanacaktır.

Hafif bir değişiklik, bilgilerin daha uzun bir ssh zincirinden geçişsel olarak geçirilmesine olanak sağlayacaktır.

ssh -t server SSH_ORIGIN=$USERNAME@$HOSTNAME:$SSH_ORIGIN bash

tartışma:

  • bash etkileşimli bir oturum açmayan kabuk olarak başlatıldı ( .profileokunmadı).
  • bash iki defa çalıştırılır ( .bashrciki defa okunur). bir kez sshd ile ve bir kez kullanıcı komutu ile.
  • sunucudaki varsayılan kabuğunu yok sayarak her zaman bash'ı başlatacak.

iki numara:

ilk önce bir ssh anahtarı oluşturmanız ve bunu ~/.ssh/authorized_keyssunucuda aktarmanız gerekir . sonra çizgiyi ile hazırlayın command="$SHELL". Bu konuda daha fazla bilgi için sshd manpage bakın.

komutu kullanarak ssh sunucusuna bağlanın:

ssh -t server SSH_ORIGIN=$USERNAME@$HOSTNAME

bu sunucuya bağlanacaktır ancak bu sefer değişken ataması gerçekleştirilmez. bunun yerine, dize ortam değişkeninde saklanır $SSH_ORIGINAL_COMMAND. sonra verilen komut ~/.ssh/authorized_keysçalıştırılır. Bir kez kabukta olduğunuzda içerdiği bilgileri işleyebilirsiniz $SSH_ORIGINAL_COMMAND.

Yukarıdaki gibi, bu geçişi yapabilirsiniz:

ssh -t server SSH_ORIGIN=$USERNAME@$HOSTNAME:$SSH_ORIGIN

tartışma:

  • sunucudaki varsayılan kabuğu başlatacak.
  • her zaman sunucudaki varsayılan kabuğu başlatacak. ssh komutuna verdiğiniz herhangi bir komut yoksayılır ve saklanır $SSH_ORIGINAL_COMMAND. ssh üzerinden bir komut çalıştırmak istiyorsanız, farklı bir ssh tuşunu kullanabilir veya kabuk init dosyanızın algılaması ve çalıştırılması için kullanabilirsiniz $SSH_ORIGINAL_COMMAND.

Birçok sunucu LC_*değişkenlerin geçmesine izin verecek şekilde yapılandırılmıştır (bunlar normalde yereller tarafından kullanılır, ancak onları alt yapabilirsiniz). Örneğin , varsayılan ayar altında makinemde LC_FOO=bar ssh localhost 'echo $LC_FOO'görüntüler bar(Debian sıkıştırmasında).
Gilles

@Gilles Evet, sunucu kabul ederse LC_*, bunu bir değişkende gizlice kullanmak için kullanabilirsiniz. Sunucuları standart LC_*değişkenleri bile kabul etmeyen , sadece herhangi bir değişkeni kabul etmeyen bazı paranoyak sistem yöneticileriyle karşılaştım .
lesmana

1

Komut who, aynı makinede şimdi kimin giriş yaptığını ve nereden giriş yaptıklarını bildirir. Komut lastgeçmiş oturumlar için aynı bilgiyi verir. Makine yapılandırmasına ve giriş yöntemlerine bağlı olarak, bilgiler her zaman eksiksiz olmayabilir, güncel olmayabilir veya kök kullanıcılara açık olmayabilir.

A @ A-> B @ B-> C @ C senaryonuzda, C makinesinin B @ B'nin A'dan ssh oturumu ile B'ye giriş yaptığını bilmek imkansızdır. 1980'lerde, herkes size güvendiğinde deneyebilirdim fingerya identama bu gün makine B hatta bir parmak ya da ident cini çalışan olması pek mümkün değildir.


1

Ben hostB üzerindeki ortam değişkenini hostA'nın adresini yazmaya zorlayabileceğini düşünüyorum. Daha sonra hostC'de hostB, voila :) 'dan ortam elde etmek için AcceptEnv kullanın.

sshd_config biraz, çevre ile ilgili bölümleri okuyun.


Bu sadece B tamamen işbirliği yaparsa işe yarar. C'nin B tarafından gönderilen değerin doğru veya fabrikasyon olup olmadığını kontrol etmesinin bir yolu yoktur.
Gilles,

AcceptEnv, istediğim bilgileri iletmek için kullanılacak potansiyele sahip. ne yazık ki, yalnızca root AcceptEnv'yi ayarlayabilir ve varsayılan hiçbir ortam değişkeni kabul etmemektir. Ben ssh çoğu makinelere kök erişimim yok.
lesmana,

0

Kutu B’den, Kutu B’ye erişimi yoksa, kullanıcının Kutu A’dan geldiğini söyleyemezsiniz. Aslında, kullanıcının Kutu C’ye nasıl ulaştığını söyleyemeyebilirsiniz. Yönetici bir şeyler ayarladı.

"Diyelim ki" sorusu için aynı cevap. Bu, sistem yöneticisinin size verdiği izinlere ve yüklediği programlara bağlıdır.

İzniniz varsa size yardımcı olacak ilgili komutlar (ancak muhtemelen kullanmazsınız):

finger - http://www.manpagez.com/man/1/finger/

last - http://www.manpagez.com/man/1/last/
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.