Documentation
¶
Overview ¶
Package upstream implements the outbound (client-side) half of the bastion: dialing targets and opening channels on their behalf.
Index ¶
Constants ¶
This section is empty.
Variables ¶
var ( // ErrUnreachable: TCP bağlantısı hiç kurulamadı. ErrUnreachable = errors.New("upstream: target unreachable") // ErrHostKeyMismatch: hedef, sabitlenmişten BAŞKA bir anahtar sundu. // Bu bir yapılandırma sorunu olabilir de olmayabilir de — postern // bu ikisini ayırt edemez ve etmemeli. ErrHostKeyMismatch = errors.New("upstream: host key mismatch") // ErrRefused: taşıma kuruldu, hedef sertifikamızı kabul etmedi. // Neredeyse her zaman tek bir şey demek: hedef bu bastion'ın CA'sına // güvenmiyor (TrustedUserCAKeys) ya da kullanıcı hedefte yok. ErrRefused = errors.New("upstream: target refused our certificate") /* * ErrHandshake: TCP kuruldu ama el sıkışma KİMLİK DOĞRULAMAYA * GELMEDEN bitti. * * ⚠️ REDDEDİLMİŞ DEĞİLİZ — hedef sertifikamızı görmedi bile. * Algoritma uyuşmazlığı, susan bir hedef, SSH konuşmayan bir port: * üçü de burada. Operatörün yapması gereken şey ErrRefused'dakiyle * hiç ilgisi olmayan bir şey, o yüzden ayrı bir sınıf. */ ErrHandshake = errors.New("upstream: ssh handshake did not complete") )
* Bağlantının NEDEN kurulamadığı. * * ⚠️ NEDEN AYRIŞTIRILIYOR: üçü de "bağlanamadım" ama operatörün yapması * gereken şey üçünde de farklı — biri ağ/firewall, biri hedefin * kimliğinin değişmesi (ya da araya girme), biri hedefin bu bastion'ın * CA'sına güvenmemesi. Hepsini tek bir "session unavailable" altında * toplamak, kullanıcıya hiçbir şey söylemeyen bir ekran bırakıyordu: * ÖLÇÜLDÜ — panelde kabuk düğmesine basınca tek görünen şey * "[disconnected]" idi, sebep yalnızca sunucu günlüğünde duruyordu.
var ProbeCommands = []string{
"uname -srm",
"cat /etc/os-release",
}
* ProbeCommands, tanımada çalıştırılan SABİT komutlar. * * ⚠️ DEĞİŞKEN DEĞİL, SABİT — ve bu listenin yapılandırılabilir olmaması * özelliğin en önemli parçası. Operatörün komut yazabildiği bir alan, * config dosyasına erişebilen herkese denetim altındaki HER MAKİNEDE * uzaktan komut çalıştırma yetkisi verirdi; bastion'ı tam da engellemek * için var olduğu şeye çevirirdi. Bu yüzden liste derleme zamanında * sabit ve gözden geçirilebilir. * * İkisi de SALT OKUMA ve yan etkisiz. Kabuk yorumuna açık hiçbir şey * içermiyorlar (joker, boru, yönlendirme, değişken yok) — SSH exec * isteği dizeyi hedefin kabuğuna verdiği için bu önemli.
Functions ¶
func ScanHostKey ¶
* ScanHostKey, hedefin SUNDUĞU host key'i getirir. * * ⚠️ BU BİR DOĞRULAMA DEĞİL, BİR SORU. Dönen anahtar "doğru" anahtar * değil; o adreste o anda cevap veren makinenin sunduğu anahtar. Ağ * yolunda duran biri kendi anahtarını sunabilir ve buradan onu alırız. * * Yine de yapıştırmalı akıştan daha kötü DEĞİL: operatör de * `ssh-keyscan`i kendi makinesinden, çoğu zaman aynı ağ üzerinden * çalıştırıp yapıştırıyordu. Kazanılan şey yazım hatasının ve "şimdilik * boş bırakayım" cazibesinin ortadan kalkması; kaybedilen bir şey yok. * Güvenlik, çağıranın parmak izini operatöre AÇIKÇA gösterip onay * istemesinden geliyor — bkz. httpapi.adminScanTarget.
Types ¶
type Conn ¶
type Conn struct {
// contains filtered or unexported fields
}
Conn is an established SSH connection to a target.
func DialWithCert ¶
func DialWithCert(ctx context.Context, t model.Target, identity Identity, authority *ca.CA) (*Conn, error)
DialWithCert connects to t using a freshly minted, short-lived certificate instead of a static key.
func (*Conn) Facts ¶
func (c *Conn) Facts() model.TargetFacts
Facts, EL SIKIŞMADAN öğrenilenleri döner.
⚠️ KAPSAM KASITLI OLARAK DAR. Buradan çıkan her şey sunucunun bağlantı kurarken kendiliğinden söylediği: afişi, anlaştığımız host key türü, bir de ne kadar sürdüğü. Hedefte `uname` ya da `/etc/os-release` okumak çok daha fazlasını verirdi — ve postern'in güven modelini bozardı: kullanıcının oturumu dışında hedefte iş çalıştırmıyoruz. Bir bastion'ın envanter aracına dönüşmesi, denetim altındaki her makinede sessizce komut çalıştırması demek.
func (*Conn) OpenSession ¶
OpenSession opens a "session" channel on the target and returns it along with the target's request stream.
func (*Conn) Probe ¶
* Probe, hedefte sabit okuma komutlarını çalıştırıp makineyi tanır. * * ⚠️ BU FONKSİYON YALNIZCA target_probe.enabled İLE ÇAĞRILIR. Kapalıyken * postern hedefte kullanıcının oturumu dışında hiçbir şey çalıştırmaz. * * ⚠️ KOMUTLAR KULLANICININ BAĞLANTISINDA ÇALIŞIR. Ayrı bir kimlik ya da * ayrı bir principal kullanmıyoruz: o, hedef tarafında postern için * ayrıca yetki açmak demekti — yani bastion'a kullanıcılardan bağımsız, * kalıcı bir erişim vermek. Bedeli şu: komutlar hedefin günlüklerinde * bağlanan kullanıcının adına görünür. Kabul edilebilir olmasının tek * sebebi özelliğin varsayılan kapalı ve her koşusunun denetime yazılıyor * olması.