การส่งต่อตัวแทน SSH โดยใช้ชื่อผู้ใช้และคีย์ที่แตกต่างกัน


19

มีคำถามคล้ายกันมากว่าถ้าตอบแล้วอาจเป็นคำตอบสำหรับคำถามนี้ น่าเสียดายที่เป็นกรณีของ "ไม่จำเป็นต้องตอบคำถามที่ฉันถามเพราะปัญหาไม่ใช่สิ่งที่ฉันคิดว่ามันเป็น"

การตั้งค่า

  1. เซิร์ฟเวอร์bastion.ec2ยอมรับการเชื่อมต่อ ssh จากเวิร์กสเตชันของฉันผ่านssh -i mykey.pem myname@bastion.ec2
  2. เซิร์ฟเวอร์service1.ec2ยอมรับการเชื่อมต่อ ssh จาก bastion.ec2ผ่านเท่านั้นssh -i sharedkey.pem shareduser@service1.ec2

ความต้องการ

  1. คีย์ทั้งสองอยู่บนเวิร์กสเตชันของฉันเท่านั้นดังนั้นฉันจึงไม่สามารถทำคำสั่งที่ 2 ได้โดยไม่ต้องคัดลอกคีย์ทับ
  2. เพื่อเหตุผลด้านความปลอดภัยฉันต้องการใช้การส่งต่อ ssh-agent แทนที่จะคัดลอกคีย์ ssh ไปยัง bastion.ec2

การแก้ไขปัญหา

นี่คือที่ที่คุณเข้ามาฉันจะส่งต่อคีย์อื่นสำหรับการเชื่อมต่อที่ 2 ได้อย่างไร

หาก shareduser มี mykey.pub สิ่ง~/.ssh/authorized_keysนี้จะใช้งานได้:

ssh -i mykey.pem myname@bastion.ec2 ssh shareduser@service1.ec2

อย่างไรก็ตามฉันไม่ต้องการให้ผู้ใช้ทุกคนต้องใส่กุญแจสาธารณะในทุกเซิร์ฟเวอร์

คำตอบ:


22

ขั้นตอนที่ 1

ตรวจสอบให้แน่ใจว่าตัวแทนท้องถิ่นของคุณพร้อมแล้ว

เพียงเพราะคุณสามารถ ssh ลงในเซิร์ฟเวอร์ป้อมปราการของคุณโดยไม่ระบุเส้นทางหลักของคุณหรือรับรหัสผ่านไม่ได้หมายความว่าเอเจนต์ ssh ของคุณกำลังทำงานและถือกุญแจอยู่ ระบบปฏิบัติการสมัยใหม่บางตัว (เช่น: OSX) จัดการสิ่งนี้ให้คุณ

บนเครื่องท้องถิ่นของคุณ

$ ssh-add -L
ssh-rsa ObahfCbvagGbLbhSbeHfvatEBG13== ~/.ssh/mykey.pem
ssh-rsa LbhNerWhfgJnnlGbbPyrireEBG13== ~/.ssh/sharedkey.pem

รูปที่ 1

นั่นหมายความว่าตัวแทนของคุณกำลังทำงานและมีกุญแจของคุณ

$ ssh-add -L
The agent has no identities.

รูปที่ 2

นั่นหมายความว่าคุณยังไม่ได้เพิ่มกุญแจใด ๆ ในตัวแทนของคุณ แก้ไขด้วย:

ssh-add ~/.ssh/mykey.pem ~/.ssh/sharedkey.pem

รูปที่ 3

ขั้นตอนที่ 2

ตรวจสอบให้แน่ใจว่าตัวแทนระยะไกลของคุณพร้อม

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

$ ssh-add -L
Could not open a connection to your authentication agent.

fig.4

นั่นหมายถึงว่าลูกค้า SSH ของคุณไม่ได้ส่งต่อการเชื่อมต่อตัวแทนการรับรองความถูกต้องของคุณ

คุณสามารถบังคับใช้สิ่งนี้ด้วยการ-Aตั้งค่าสถานะ (ตราบใดที่การกำหนดค่าsshdบนเซิร์ฟเวอร์อนุญาตซึ่งเป็นค่าเริ่มต้น )

$ ssh -A bastion.ec2

fig.5

ขั้นตอนที่ 3

ตรวจสอบให้แน่ใจว่าคุณใช้กุญแจที่ถูกต้อง

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

เอาท์พุทคู่สาธารณะเพื่อคีย์ส่วนตัวของคุณ:

$ cd
$ cd .ssh
$ ssh-keygen -y -f mykey.pem
ssh-rsa ObahfCbvagGbLbhSbeHfvatEBG13
$ ssh-keygen -y -f sharedkey.pem
ssh-rsa LbhNerWhfgJnnlGbbPyrireEBG13

fig.6

เหล่านี้ควรจะเป็นเช่นเดียวกับสิ่งที่คุณได้เห็นจากการssh-add -Lขึ้นไป==ใกล้ถึงจุดสิ้นสุด

ทีนี้ไม่ทางใดก็ทางหนึ่งคุณต้องเข้าไปในช่องที่คุณไม่สามารถเชื่อมต่อและดูเนื้อหาของ$HOME/.ssh/authorized_keysไฟล์สำหรับผู้ใช้ที่คุณกำลังพยายามเชื่อมต่อด้วย คุณต้องแน่ใจว่ากุญแจสาธารณะที่คุณส่งออกด้วยคำสั่งด้านบนนั้นอยู่ในไฟล์นั้นบนบรรทัดด้วยตัวมันเอง คุณไม่สามารถเชื่อถือได้ว่าsharedkey.pubBro 2 ก้อนส่งอีเมลถึงคุณถูกต้องแล้ว ตรวจสอบ! สิ่งนี้อาจต้องการการรับคนอื่นที่สามารถใช้ SSH ในฐานะผู้ใช้รายนั้นเพื่อให้คุณได้รับไฟล์ authorized_keys หรือการเข้าถึงรูท หากคุณมาไกลขนาดนี้ แต่ก็ยังใช้งานไม่ได้

ขั้นตอนที่ 4

ทำให้เป็นเรื่องง่าย

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

กำหนดค่าโลคอล ssh-client ของคุณ

Host *
    # A lot of people put an IdentityFile line in this Host * section.
    # Don't do that unless you will use only 1 key everywhere forever.
    #IdentityFile id_rsa

Host bastion.ec2
    # You want to make sure you always forward your agent to this host.
    # But don't forward to untrusted hosts. So don't put it in Host *
    ForwardAgent yes
    # Go a head and put the IP here in case DNS ever fails you.
    # Comment it out if you want. Having it recorded is a good backup.
    HostName 172.31.0.1
    # You don't want to create a proxy loop later, so be explicit here.
    ProxyCommand none
    # SSH should try using all keys in your .ssh folder, but if you
    # know you want this key, being explicit speeds authentication.
    IdentityFile ~/.ssh/mykey.pem

# Connect effortlessly by hostname or IP address
# This assumes that your internal DNS uses the fake TLD ec2
# This assumes that 172.31.0.0 is your C-Class subnet
Host *.ec2 172.31.*
    # This command says proxy all ssh connections through bastion as if
    # you had done an ssh -A
    ProxyCommand ssh -W %h:%p bastion.ec2
    ForwardAgent yes
    # These next lines are documentation you leave as a love letter to
    # your future self when all else fails or you have to help a
    # coworker and decide to look at your own config.
    # ssh-add ~/.ssh/*.pem
    # ssh -At bastion.ecs ssh admin@172.31.18.19

fig.7

ถ้าคุณใช้อะไรอย่างอื่นออกไปจากfig.7มันควรจะใช้ที่เหมาะสมของงานProxyCommandForwardAgent

เติม. bash_profile ของคุณโดยอัตโนมัติ

คุณไม่ต้องการที่จะทำssh-addด้วยตนเองทุกครั้งที่คุณเข้าสู่เครื่องของคุณ ~/.bash_profileเป็นสคริปต์ที่ทำงานทุกครั้งที่คุณเข้าสู่ระบบ ** ใส่สายจากรูปที่ 3ในนั้นและคุณควรมีตัวแทนของคุณพร้อม

** อย่าสับสนกับสิ่งนี้.bashrcที่ทำงานสำหรับเทอร์มินัล [แบบโต้ตอบ] ใหม่ ตัวแทนของคุณยังคงทำงานแม้ว่าคุณจะปิดเซสชันเทอร์มินัลทั้งหมด ไม่จำเป็นต้องโหลดกุญแจของคุณอีกครั้ง

ทางเลือกในการใช้. bash_profile

ฉันยังได้สร้างส่วนสำคัญที่เพิ่มตัวแทน OSX / MacOS เปิดตัว คุณสามารถใช้วิธีการดังกล่าวในการเริ่มต้นssh-agentระบบของคุณ มันง่ายมากที่จะติดตั้ง:

curl -sSL https://gist.github.com/RichardBronosky/429a8fff2687a16959294bcee336dd2a/raw/install.sh | bash

ขั้นตอนที่ 2: คุณไม่สามารถบังคับForwardAgent yesด้วย-Aถ้าเจ้าภาพไม่อนุญาตให้มัน
dlamblin

ขอบคุณ @dlamblin ฉันได้เพิ่มข้อมูลที่เกี่ยวข้องและลิงก์ไปยังเอกสาร sshd
Bruno Bronosky

1

นี่คือที่ที่คุณเข้ามาฉันจะส่งต่อคีย์อื่นสำหรับการเชื่อมต่อที่ 2 ได้อย่างไร

คุณไม่ได้ส่งต่อกุญแจ คุณส่งต่อเอเจนต์และสามารถมีคีย์อิสระที่สมบูรณ์กว่าที่คุณใช้สำหรับการพิสูจน์ตัวตนในการกระโดดครั้งแรก ssh-add -Lตรวจสอบคีย์ในตัวแทนของคุณโดยใช้

แต่ยิ่งไปกว่านั้นให้เรียกใช้การเชื่อมต่อผ่านProxyCommand ssh -W %h:%p myname@bastion.ec2ซึ่งจะหลีกเลี่ยงความจำเป็นในการส่งต่อเอเจนต์ตัวเลือกฮีปหรือบรรทัดคำสั่งและจำเป็นต้องพิสูจน์ตัวตนจากโฮสต์ทันที

คุณสามารถใส่ลงใน config ของคุณ (ดูman ssh_config)


1
โชคดีที่ฉันรู้จริง ๆ ว่าคุณกำลังพูดถึงที่นี่ แต่ผู้ใช้โดยเฉลี่ยจะไม่ คุณโต้แย้งความหมายกับสิ่งที่ "คุณส่งต่อตัวแทนไม่ใช่กุญแจ" คุณให้ฉันพอที่จะดำเนินการต่อไปว่าฉันสามารถแก้ปัญหานี้ได้ดังนั้นฉันต้องการให้โอกาสคุณในการแก้ไขคำตอบของคุณก่อนที่ฉันจะเพิ่มของฉันเอง คำแนะนำ: ssh-add mykey.pem sharedkey.pemจากนั้นยืนยันด้วยssh-add -Lตอนนั้นssh -At myname@bastion.ec2 ssh shareduser@service1.ec2
Bruno Bronosky
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.