เซิร์ฟเวอร์ Bastion: ใช้การส่งต่อ TCP กับการวางกุญแจส่วนตัวบนเซิร์ฟเวอร์


10

เรามีเซิร์ฟเวอร์ป้อมปราการ B. เราจำเป็นต้อง SSH จาก A ถึง B ถึง C โดยใช้คีย์ส่วนตัว

ตัวเลือกที่ดีกว่าคืออะไร:

  • วางคีย์ SSH ส่วนตัวบนเซิร์ฟเวอร์ B เราอ่านว่าเป็นความคิดที่ดีที่จะทำเช่นนั้นในสภาพแวดล้อมการใช้งานจริง

    จากที่นี่ :

    อย่าวางกุญแจส่วนตัว SSH ของคุณบนอินสแตนซ์ป้อมปราการ ใช้ตัวแทนส่งต่อ SSH เพื่อเชื่อมต่อกับป้อมปราการก่อนและจากที่นั่นไปยังอินสแตนซ์อื่นในเครือข่ายส่วนตัว สิ่งนี้จะช่วยให้คุณเก็บรหัสส่วนตัว SSH ไว้ในคอมพิวเตอร์ของคุณ

  • การใช้งานการส่งต่อตัวแทน SSH สำหรับการตั้งค่าการส่งต่อตัวแทนฉันต้องอนุญาตการส่งต่อ TCP เมื่อตั้งค่าการส่งต่อเอเจนต์ไฟล์ซ็อกเก็ตจะถูกสร้างขึ้นบนโฮสต์การส่งต่อซึ่งเป็นกลไกที่คีย์สามารถส่งต่อไปยังปลายทาง ในการตั้งค่า Bastion ที่ AWS:

    TCP ไปข้างหน้า: การตั้งค่านี้เป็นจริงจะเปิดใช้งานการส่งต่อ TCP (SSH tunneling) สิ่งนี้มีประโยชน์มาก แต่ก็มีความเสี่ยงด้านความปลอดภัยดังนั้นเราขอแนะนำให้คุณใช้การตั้งค่าเริ่มต้น (ปิดใช้งาน) ยกเว้นว่าจำเป็น

    จากที่นี่ :

    การส่งต่อตัวแทน SSH ถือว่าเป็นอันตราย

อะไรดีกว่า? สิ่งที่เกี่ยวกับทางเลือกจากลิงค์ที่สอง: ProxyCommandฉันเข้าใจว่ามันช่วยในเรื่องของไฟล์ซ็อกเก็ต แต่ฉันคิดว่าฉันยังต้องเปิดใช้งานการส่งต่อ TCP ดังนั้นมันปลอดภัยหรือไม่


2
ด้วย ProxyCommand คุณไม่จำเป็นต้องเปิดใช้งานการส่งต่อ TCP การส่งต่อจะกระทำโดย ssh บนโฮสต์ระดับกลาง
wurtel

ขอบคุณ ไฟล์การกำหนดค่าควรเป็นอย่างไร ในคอมพิวเตอร์ของฉันหรือใน Bastion
user2503775

บนระบบโลคัลของคุณที่คุณจะป้อนssh hostbคำสั่งเพื่อให้สามารถค้นหา hostb ในการกำหนดค่าโลคัลและรู้ว่าจำเป็นต้องเชื่อมต่อผ่าน hosta ไม่สามารถทำได้ถ้าคุณตั้งค่า
โฮสต์

รหัสส่วนตัวของเซิร์ฟเวอร์ C จะถูกเก็บไว้ที่ไหน? ยังอยู่ในคอมพ์ของฉัน? ฉันใช้ keepass กับ keeAgent
2503775

2
ฉันเกรงว่าคุณกำลังทำให้เกิดความสับสนการส่งต่อ TCPที่มีการส่งต่อตัวแทน พวกมันต่างกัน
MLu

คำตอบ:


13

ใช้ ProxyCommand หรือ ProxyJump

ฉันอยากจะแนะนำให้ใช้ProxyCommand(หรือดียิ่งขึ้นProxyJumpเพราะไวยากรณ์ง่ายขึ้น แต่ต้อง openssh 7.3+ ฉันคิดว่าในฝั่งไคลเอ็นต์) และคุณไม่จำเป็นต้องปรับใช้คีย์ส่วนตัวบน Bastion ทุกอย่างอยู่ในท้องถิ่น

ตัวอย่างกับ ProxyJump

บนคอมพิวเตอร์ไคลเอนต์ของคุณคุณเขียนไฟล์ภายใต้~/.ssh/configเนื้อหาที่คล้ายกันเพื่อตะโกน:

Host bastion
  HostName bastion.example.com
  User bastion-user
  Port 22
  IdentityFile ~/.ssh/id_bastion

Host srvC
  HostName srvC.local
  User server-user
  IdentityFile ~/.ssh/id_protected_lan
  ProxyJump bastion

จากนั้นการดำเนินการssh srvCจะเชื่อมต่อคุณกับ C ผ่านทาง B (ป้อมปราการ) โดยไม่ต้องมี Agent Forwarding หรือปรับใช้ไพรเวตคีย์ให้กับป้อมปราการ

ในตัวอย่างข้างต้น "bastion" เป็นนามแฝงของ Bastion host ของคุณและ srvC เป็น alias ไปยังเซิร์ฟเวอร์ของคุณ C HostNameคุณต้องใส่ IP หรือชื่อโดเมนที่ผ่านการรับรองจริงสำหรับโฮสต์ของคุณ สำหรับผู้ใช้คุณต้องอัปเดตUserชื่อล็อกอินที่ถูกต้องบน Bastion และเซิร์ฟเวอร์ C ในที่สุดIdentityFileจะเป็นตัวเลือกถ้าคุณใช้ตัวแทนท้องถิ่น (เช่น KeeAgent หรือ ssh-agent) แต่ถ้ามันไม่ได้ทำงานอยู่ก็จะยัง ทำงานและถามคุณสำหรับวลีรหัสผ่านแต่ละคีย์

การปรับใช้กุญแจสาธารณะ

แน่นอนว่าคุณต้องใช้กุญแจสาธารณะกับทั้งป้อมปราการและ srvC คุณสามารถใช้ (เครื่องหมาย $ เป็นเพียงเพื่อแสดงให้เห็นพร้อมท์อย่าพิมพ์):

$ ssh-copy-id -i ~/.ssh/id_bastion.pub \
   -o PreferredAuthentications=password \
   -o PubkeyAuthentication=no \
   bastion
$ ssh-copy-id -i ~/.ssh/id_protected_lan.pub \
   -o PreferredAuthentications=password \
   -o PubkeyAuthentication=no \
   srvC

หมายเหตุ: ข้างต้นจะทำงานเฉพาะในกรณีที่ยังคงอนุญาตให้ใช้การตรวจสอบรหัสผ่าน หลังจากการปรับใช้ข้างต้นและตรวจสอบว่าทุกอย่างทำงานตามที่ตั้งใจไว้คุณควรไม่อนุญาตการตรวจสอบรหัสผ่านบนเซิร์ฟเวอร์ 2 เครื่อง

ตัวอย่างกับ ProxyCommand แทน ProxyJump

หากคุณมี OpenSSH เวอร์ชั่นเก่ากว่าซึ่งไม่รองรับProxyJump(ทางฝั่งไคลเอ็นต์) ให้แทนที่:

ProxyJump bastion

โดย

ProxyCommand ssh -q -W %h:%p bastion

เท่าที่ฉันเข้าใจนี่คล้ายกัน


ขอบคุณ! ฉันทำงานกับ linux แต่เรามีสมาชิกในทีมบางคนกำลังทำงานบน windows มันควรจะทำงานที่นั่นด้วยใช่ไหม
user2503775

ลูกค้า SSH คนไหนที่จะใช้ OpenSSH (ผ่าน WSL หรือ cygwin หรืออื่น ๆ ) หรือ PuTTY (หรือเครื่องมืออื่นที่อิง PuTTY) เช่น MobaXterm
Huygens

บางคนใช้ PuTTy และบางคนใช้ ssh ผ่าน Git Shell
user2503775

@ user2503775 ฉันไม่เคยลองด้วย PuTTY แต่ดูเหมือนว่าจะเป็นไปได้โดยใช้วิธีการของ ProxyCommand ดูที่นี่: stackoverflow.com/a/28937185
Huygens

1
ขอบคุณมากสำหรับคำตอบอย่างละเอียด!
user2503775

5

ฉันเห็นคำตอบเกี่ยวกับ ProxyJump พูดคุยเกี่ยวกับ Let 's ProxyCommand

แต่เดี๋ยวก่อนเดี๋ยวก่อน! ฉันสามารถเขียนถึงคุณถึงวิธีแฮ็คเซิร์ฟเวอร์ที่ใช้การส่งต่อตัวแทนซึ่งจะเข้าใจความแตกต่างได้ง่ายขึ้น!

มาแฮ็คกันเถอะ!

สำหรับขั้นตอนพื้นฐาน: คุณสามารถอ่านโพสต์ของฉันที่นี่

ขั้นตอนพื้นฐานดังต่อไปนี้:

  1. สร้างผู้ใช้ป้อมปราการ
  2. ปิดใช้งานการเข้าสู่ระบบราก
  3. บล็อกการแฮ็คข้อมูล
  4. เปลี่ยนพอร์ต
  5. กำหนดค่าไฟร์วอลล์
  6. กำหนดค่า SELinux

วิธีใช้ AgentForwarding

- สร้าง config ใน ~ / .ssh / config

  Host bast
        Hostname BASTION_IP
        ForwardAgent yes
        User bastion

- เพิ่มคีย์การรับรองความถูกต้องของคุณเพื่อ ssh-agent

ssh-add ~/.ssh/name_rsa

- เชื่อมต่อกับป้อมปราการเหลวแหลก

ssh bast

เชื่อมต่อแอปพลิเคชันเซิร์ฟเวอร์จากป้อมปราการ

 ssh app@IP -p PORT

แฮ็ก!

คุณอาจถามคำถามฉัน:

  • เซิร์ฟเวอร์ของฉันปลอดภัยหรือไม่? และคำตอบนั้นง่ายมาก:

    • NO!
  • ทำไม?

    • เพราะคุณกำลังใช้การส่งต่อตัวแทน SSH!
  • และปัญหาอยู่ที่ไหน

    • เนื่องจากการส่งต่อตัวแทนเป็นสิ่งที่อันตรายและถือว่าเป็นอันตราย
  • ทำไม?

    • มาอธิบายทุกอย่างจากภายใน: เมื่อคุณเชื่อมต่อกับโฮสต์ของป้อมปราการเอสเอสเอสตัวแทนของคุณจะถูกส่งต่อ หมายความว่าซ็อกเก็ตจะถูกตั้งค่าเพื่อให้บางคนอาจใช้ข้อมูลซ็อกเก็ตนี้เพื่อเข้าถึงเซิร์ฟเวอร์ของคุณ ลองนึกภาพว่าเซิร์ฟเวอร์ป้อมปราการของคุณถูกบุกรุกหากใครบางคนมีสิทธิ์เพียงพอบนเซิร์ฟเวอร์ Linux เขา / เธอก็จะใช้ข้อมูลซ็อกเก็ตของคุณ เป็นผลให้เซิร์ฟเวอร์ของคุณทั้งหมดสามารถเข้าถึงได้ ฉันรู้ว่าหน้าต่างของการประนีประนอมนั้นเล็กมากเพราะมันขึ้นอยู่กับเวลาที่คุณเชื่อมต่อกับโฮสต์ของป้อมปราการ แต่คุณต้องการเสี่ยงเมื่อคุณมีตัวเลือกอื่น ๆ เช่น ProxyCommand หรือไม่? ดังนั้นเพียงใช้ ProxyCommand!

จะแฮ็กเซิร์ฟเวอร์ได้อย่างไรถ้าคุณโจมตีโฮสต์ป้อมปราการ?

ติดตามเป้าหมาย

ในไดเรกทอรี / tmp คุณอาจเห็นสิ่งนั้น:

[root@localhost tmp]# ll
total 12
drwx------  2 bastion bastion 4096 Sep  7 17:35 ssh-mKX88v0Vlo

มาเปิดไฟล์ชั่วคราวกัน

[root@localhost tmp]# cd ssh-mKX88v0Vlo/
[root@localhost ssh-mKX88v0Vlo]# ll
total 0
srwxr-xr-x 1 bastion bastion 0 Sep  7 17:35 agent.10507

เรามาดูการเชื่อมต่อกับ id กระบวนการนี้

netstat -nxp | grep  10507

ผลลัพธ์:

unix  [ ]   STREAM     CONNECTED     501384   10507/sshd: bastion

และใครเชื่อมต่อกัน

lsof -i -a -p 10507

ผลลัพธ์:

COMMAND  PID   USER  FD  TYPE DEVICE SIZE/OFF NODE NAME
sshd    10507 bastion  3u  IPv4 501301  0t0  TCP *IP*:ssh->*IP*:8279 (ESTABLISHED)

เรายังสามารถดูไฟล์ซ็อกเก็ต:

cd /proc/10507/fd/
ls

ผลลัพธ์:

lrwx------ 1 root root 64 Sep  7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep  7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep  7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep  7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep  7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep  7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep  7 17:46 9 -> socket:[502080]

และจะเกิดอะไรขึ้นเมื่อไคลเอ็นต์จะเชื่อมต่อกับเซิร์ฟเวอร์ระยะไกล มาดูกัน:

lrwx------ 1 root root 64 Sep  7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:48 11 -> socket:[502267]
lrwx------ 1 root root 64 Sep  7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep  7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep  7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep  7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep  7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep  7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep  7 17:46 9 -> socket:[502080]

เราสามารถดูได้ว่าไฟล์ซ็อกเก็ตถูกใช้โดยใช้ netstat

unix  3 [ ]  STREAM  CONNECTED  502267  10561/sshd: 
                     bastion  /tmp/ssh-oVoMXC6vb8/agent.10561
unix  3  [ ] STREAM     CONNECTED     502072   10561/sshd:  bastion 

ขโมยข้อมูลซ็อกเก็ตและที่อยู่ IP

ตอนนี้เราต้องขโมยข้อมูลซ็อกเก็ตในขณะที่เซสชันของโฮสต์ป้อมปราการเปิดอยู่ โอ้เราต้องการปลายทาง IP ของเซิร์ฟเวอร์ด้วยดังนั้นใช้ netstat:

netstat -tn

ขั้นตอนสุดท้ายที่จะใช้แฟ้มซ็อกเก็ตส่งต่อ

eval "$(ssh-agent -s)"
SSH_AUTH_SOCK=/tmp/ssh-EAKxOdL4fl/agent.10507

ตรวจสอบว่ามีการโหลดกุญแจหรือไม่

ssh-add -l

ส่งผลให้ควรเป็นสิ่งที่ชอบ :

2048 SHA256:2Psdl..B5KQ /home/usr/.ssh/name_rsa (RSA)

เซิร์ฟเวอร์ถูกแฮกวิธีการแก้ไขปัญหาความปลอดภัย

คำสั่งพร็อกซี

Host app
    Hostname *.*.*.*
    IdentityFile ~/.ssh/your_rsa
    User *******
    Port ****
    ProxyCommand ssh -W %h:%p bast

Host bast
     Hostname *.*.*.*
     ForwardAgent no
     User ******

สำหรับการดำเนินการขั้นพื้นฐาน: วิธีการถ่ายโอนไฟล์ผ่านเซิร์ฟเวอร์ (จากไคลเอนต์ไปยังเซิร์ฟเวอร์, เซิร์ฟเวอร์ไปยังไคลเอนต์) คุณสามารถอ่านโพสต์ของฉันที่นี่

ข้อสรุป

  • หากคุณใช้โฮสต์ bastion อย่าใช้ AgentForwarding แต่ใช้ ProxyCommand
  • ใช้ผู้ใช้ที่ไม่ใช่รูทเสมอสำหรับการตรวจสอบสิทธิ์
  • ใช้ไฟร์วอลล์และบล็อกการเชื่อมต่อที่ไม่จำเป็นทั้งหมด
  • ใช้ SELinux (โดยทั่วไป)
  • บล็อกที่อยู่ IP ที่พยายามเข้าสู่ระบบหลายครั้งด้วยข้อมูลประจำตัวที่ไม่ถูกต้อง
  • หากไม่จำเป็นไม่ต้องให้สิทธิ์ sudo แก่ผู้ใช้
  • ตรวจสอบเซิร์ฟเวอร์ของคุณ
  • อัปเดตเซิร์ฟเวอร์ของคุณสำหรับแพตช์ความปลอดภัย

สำหรับข้อมูลเพิ่มเติมโปรดดูที่ของฉันบล็อก นอกจากนี้ฉันมี screeenshots ดังนั้นจึงอาจเป็นประโยชน์สำหรับคุณ


ขอบคุณมาก! จริงๆแล้วเราใช้ google authenticator ด้วยเมื่อเข้าสู่ระบบ
user2503775

ฉันได้รับข้อผิดพลาดเมื่อพยายามที่จะเรียกแอป channel 0: open failed: administratively prohibited: open failed. stdio forwarding failed. SSH: คุณมีความคิดว่าทำไม? ที่ล็อกที่ปลอดภัยฉันเห็น:refused local port forward: originator 127.0.0.1 port 65535, target *app-ip* port 22
2503775

ข้อมูลยอดเยี่ยม คำแนะนำเล็ก ๆ เพื่อปรับปรุงความสามารถในการอ่านคำตอบของคุณ อย่าคัดลอก / วางเนื้อหาของบล็อกของคุณที่นี่ ระบุลิงก์และเป็นบทสรุป จากนั้นเน้นส่วนคำตอบที่แท้จริง (สำหรับคุณที่ใช้ ProxyCommand) ฉันเห็นคุณลองแล้วตอนแรก แต่ให้คัดลอก / วางส่วนมันทำให้สับสน อย่างไรก็ตาม +1
Huygens

@ user2503775 มันควรจะเป็นปัญหาที่แตกต่างไม่เกี่ยวข้องกับคำสั่งการส่งต่อ / ตัวแทน ssh-agent มาเปิดคำถามใหม่พร้อมกับบันทึก
grep


4

เพียงใช้การส่งต่อตัวแทน SSHเหมือนที่คนอื่นทำ

  • กุญแจจะอยู่ในตัวแทน SSHบนแล็ปท็อปของคุณ
  • คุณเข้าสู่ป้อมปราการรับรองความถูกต้องผ่านตัวแทน
  • จากนั้นเข้าสู่ระบบคุณกำหนดเป้าหมายโฮสต์ที่มีการร้องขอการรับรองความถูกส่งกลับไปที่แล็ปท็อปของคุณ

ข้อได้เปรียบ: ไม่มีกุญแจเก็บไว้ในป้อมปราการที่สามารถนำไปใช้ในทางที่ผิด

หวังว่าจะช่วย :)


สวัสดีนั่นเป็นสิ่งที่ OP อธิบายในสัญลักษณ์แสดงหัวข้อย่อยที่สองของเขา / เธอ ฉันแนะนำให้คุณตรวจสอบลิงก์ที่สองที่ให้ไว้ในคำถาม
Huygens

@Huygens จริงฉันสังเกตเห็นตอนนี้ ฉัน overloked ว่าในขณะที่เขาผสมกันการส่งต่อ TCP กับตัวแทนส่งต่อ
MLu

อันที่จริงแล้วนี่คละ :-)
Huygens

มันไม่ได้ผสม ฉันเข้าใจความแตกต่าง ฉันแก้ไขคำถามเพื่อให้ชัดเจน
user2503775

ฉันเขียนคำตอบวิธีแฮ็คตัวแทนการส่งต่อ (ไม่มีคีย์ แต่มีซ็อกเก็ตเปิด) โดยทั่วไปการส่งต่อตัวแทนก็โอเคเพราะความเป็นไปได้ที่จะขโมยกุญแจนั้นน้อยมาก - ก่อนอื่นคุณต้องแฮ็คโฮสต์ของป้อมปราการ อย่างไรก็ตามคุณสามารถเห็นคำตอบของฉัน: serverfault.com/a/958466/476642
grep
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.