upstream

package
v1.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 3, 2026 License: Apache-2.0 Imports: 16 Imported by: 0

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

View Source
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.

View Source
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

func ScanHostKey(ctx context.Context, host string, port int) (ssh.PublicKey, error)

* 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) Client

func (c *Conn) Client() *ssh.Client

Client exposes the underlying SSH client

func (*Conn) Close

func (c *Conn) Close() error

Close closes the connection to the target.

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

func (c *Conn) OpenSession() (ssh.Channel, <-chan *ssh.Request, error)

OpenSession opens a "session" channel on the target and returns it along with the target's request stream.

func (*Conn) Probe

func (c *Conn) Probe(ctx context.Context) (model.TargetProbe, error)

* 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ı.

type Identity

type Identity struct {
	PosternUser string

	OSUser string
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL