ssh-agent และหน้าจอ


8

กลับในขณะที่ใน StackOverflow ผมถามคำถามเกี่ยวกับตัวแทน ssh และ crontab ฉันมีคำถามที่คล้ายกันตอนนี้เกี่ยวกับ ssh-agent และหน้าจอบนระบบลินุกซ์

ดังนั้นสำหรับ Mac ของฉัน ssh-agent จะเปิดตัวเมื่อเริ่มต้นระบบดังนั้นจึงใช้ได้เสมอสำหรับฉัน ฉันคิดว่ามันจะเป็นจริงภายใต้ linux ของฉัน (redhat el5 / fedora) ถ้าฉันใช้ X-Windows อย่างไรก็ตามนี่คือเครื่องเซิร์ฟเวอร์ระยะไกลและฉันมักจะเข้าสู่ระบบผ่านทาง ssh

ฉันชอบที่จะตั้งค่า ssh-keys อย่างถูกต้องดังนั้นฉันจึงไม่ต้องป้อนรหัสผ่านหลายครั้งในระหว่างการอัปเดตหรือส่งมอบ svn ฉันยินดีที่จะพิมพ์ข้อความรหัสผ่านของฉันหนึ่งครั้งต่อเซสชันและฉันไม่อยากให้ทีมของเรามีรหัสผ่าน ssh-keys

สำหรับช่วงเวลาสั้น ๆ ที่ส่องแสงดูเหมือนว่าการทำ "eval` ssh-agent -s` "ใน. bash_profile ของฉันจับคู่กับคำสั่งเพื่อฆ่า ssh-agent เมื่อฉันออกจากระบบจะทำงานได้ อย่างไรก็ตามเราใช้ประโยชน์จากหน้าจออย่างหนักเพื่อจัดการโปรแกรมอินเทอร์แอคทีฟระยะยาวและสภาพแวดล้อมการพัฒนา หากคุณเริ่มต้น & หยุด ssh-agent ตามที่ฉันอธิบายไว้มันจะถูกฆ่าเมื่อคุณออกจากเทอร์มินัลและเซสชันย่อยของหน้าจอที่เคยอ้างถึงอินสแตนซ์ ssh-agent นั้นถูกทอดทิ้ง

ดังนั้น ... ฉันจะเป็นผู้ใช้คอนโซลที่ใช้หน้าจอใครใช้รหัสผ่านกับ ssh-keys ของเขาซึ่งไม่ต้องพิมพ์ข้อความรหัสผ่านอย่างต่อเนื่อง?

คำตอบ:


4

กับการตั้งค่าต่อไปนี้คุณจะไม่ต้องห่อหุ้มใด ๆ screenสำหรับการกล่าวอ้าง นอกจากนี้ยังหลีกเลี่ยงการใช้/tmp(ด้วยความเสี่ยงด้านความปลอดภัยที่ตามมา)

  1. ตรวจสอบให้แน่ใจว่าคุณมีไดเรกทอรี ~ / tmp:

    mkdir ~/tmp
    
  2. เพิ่ม.screenrcในบรรทัดต่อไปนี้:

    setenv SSH_AUTH_SOCK "$HOME/tmp/ssh-agent-screen"
    
    • เพื่อให้แน่ใจว่าภายในscreen, sshรูปลักษณ์สำหรับซ็อกเก็ตมักจะอยู่ในสถานที่เดียวกันมากกว่าเส้นทางการเปลี่ยนแปลง
    • คุณต้องใช้setenvเชลล์ใดก็ตามที่คุณใช้เนื่องจากเป็นหน้าจอไม่ใช่คำสั่งเชลล์
  3. เพิ่ม.bash_profileในบรรทัดต่อไปนี้:

    [ -n "$SSH_AUTH_SOCK" ] && [ "$SSH_AUTH_SOCK"!="$HOME/tmp/ssh-agent-screen" ] && ln -sf "$SSH_AUTH_SOCK" "$HOME/tmp/ssh-agent-screen"
    
    • นี้จะเชื่อมโยงจากที่ตั้งถาวร (ที่sshรูปลักษณ์) ไปหนึ่งจริงและจะต้องปรากฏหลังจากที่ssh-agentเริ่มต้น
    • การใช้[ -n "$SSH_AUTH_SOCK" ]อย่างถูกต้องจะป้องกันข้อผิดพลาดเมื่อSSH_AUTH_SOCKไม่ได้ตั้งค่า
    • [ "$SSH_AUTH_SOCK"!="$HOME/tmp/ssh-agent-screen" ]จะป้องกันไม่ให้การประชุมหน้าจอการเชื่อมโยง $ HOME / tmp / ตัวแทน ssh .bash_profileหน้าจอเพื่อตัวเองถ้าแหล่งที่มาของหน้าจอ
  4. แทนที่จะเริ่มต้นssh-agentใน.bash_profileคุณสามารถพิจารณาการเชื่อมต่อกับssh -A(ตัวแทนการใช้งานการส่งต่อและทำให้เครื่องระยะไกลใช้ตัวแทนของคุณ)

หลังจากตั้งค่านี้คุณสามารถใช้คำสั่งหน้าจอมาตรฐาน คุณจะต้องสร้างเซสชันที่มีอยู่อีกครั้งหรือตั้งค่า SSH_AUTH_SOCK ด้วยตนเองในตำแหน่งที่คงที่ของขั้นตอนที่ 2

เครดิตในเว็บไซต์นี้สำหรับความคิด; /tmpผมหลีกเลี่ยงการใช้ คำตอบนี้คล้ายกัน แต่ใช้นามแฝงพิเศษ


2

คุณสามารถเรียกใช้ ssh-agent จาก initscript แทนได้.bash_profileหรือไม่? ตัวอย่างเช่นฉันอาจจะใส่

su -c 'ssh-agent -s > ~/.ssh_agent_env' myusername

ในส่วนที่เหมาะสม/etc/conf.d/localแม้ว่า RHEL / Fedora อาจใช้ระบบอื่น ตามที่คุณระบุไว้ในความคิดเห็นเซสชันเทอร์มินัลจะต้องสามารถเชื่อมต่อกับเอเจนต์ซึ่งเป็นสาเหตุที่คำสั่งนั้นสร้างไฟล์.ssh_agent_envในโฮมไดเร็กตอรี่ของผู้ใช้ จากนั้นคุณสามารถเพิ่ม

[ -f ~/.ssh_agent_env ] && source ~/.ssh_agent_env >/dev/null

ใน.bash_profile.

อีกสิ่งที่คุณสามารถทำได้คือใส่สิ่งต่อไปนี้ .bash_profile

ps -U myusername | grep -q ssh-agent || ssh-agent -s > ~/.ssh_agent_env
source ~/.ssh_agent_env >/dev/null

ซึ่งจะเริ่มต้นssh-agentเฉพาะเมื่อยังไม่ได้ทำงาน จากนั้นคุณไม่ต้องฆ่ามัน

ในฐานะที่เป็นทางเลือกที่แตกต่างกันเล็กน้อยเพื่อให้ข้อเสนอแนะที่สองแทนการตรวจสอบสำหรับการดำรงอยู่ของนั้นssh-agentกระบวนการคุณสามารถตรวจสอบสำหรับการดำรงอยู่ของไฟล์~/.ssh_agent_env,

[ -f ~/.ssh_agent_env ] || ssh-agent -s > ~/.ssh_agent_env
source ~/.ssh_agent_env >/dev/null

หากทุกอย่างทำงานอย่างถูกต้องไม่ควรมีความแตกต่างอย่างมีนัยสำคัญระหว่างสองวิธี


แนวคิด initscript นั้นน่าสนใจ - โดยทั่วไปเพียงแค่เริ่มที่การเริ่มต้นระบบสำหรับผู้ใช้ทุกคนที่ต้องการหรือไม่ ที่สามารถทำงานได้ เรามีผู้ใช้จำนวนมากที่ไม่สนใจ การที่ดีกว่าการไม่มีข้อความรหัสผ่านหรือไม่นั้นเป็นคำถามที่น่าสนใจเพราะฉันสงสัยว่านั่นหมายความว่าคุณจะต้องป้อนเพียงครั้งเดียวต่อการรีสตาร์ทเครื่อง อืมมม ทั้งที่และข้อเสนอแนะที่สองขึ้นอยู่กับเทอร์มินัลเซสชันใหม่ที่สามารถเชื่อมต่อกับ ssh-agent ถ้ามันกำลังทำงานอยู่ ฉันไม่สมบูรณ์แน่ใจว่ามันเป็นเรื่องที่ง่าย แต่ฉันยังไม่ได้พยายาม ขอบคุณสำหรับความคิด!
Michael H.

@khedron: ใช่ แต่คุณต้องใส่หนึ่งบรรทัดใน/etc/conf.d/local(หรือเทียบเท่าของคุณ) สำหรับผู้ใช้แต่ละคนที่ใช้ตัวแทนเพื่อเริ่มssh-agentกระบวนการแยกต่างหากต่อผู้ใช้ ถ้าอย่างที่คุณพูดคุณไม่มีผู้ใช้จำนวนมากนั่นจะไม่เลวร้ายนัก คุณยกประเด็นที่ดี (ซึ่งฉันลืมพิจารณา) เกี่ยวกับเซสชันเทอร์มินัลที่เชื่อมต่อกับเอเจนต์ เห็นการแก้ไขคำตอบของฉัน
David Z


2

วิธีที่ดีกว่าคือการใช้การส่งต่อตัวแทน ( -Aตัวเลือก) สิ่งนี้อนุญาตให้ผู้ใช้ ssh ใช้คีย์จากเอเจนต์ ssh ที่ทำงานบนเครื่องที่มาจากสันนิษฐานว่าเป็นเวิร์กสเตชันที่พวกเขานั่งอยู่


นอกจากนี้ยังช่วยให้ผู้โจมตีที่โจมตีบัญชีของคุณสามารถประนีประนอมบัญชีบนเครื่องอื่น ๆ ที่ตัวแทนสามารถเข้าถึงได้ ฉันจึงพยายามที่จะส่งตัวแทน SSH ให้น้อยที่สุด
ราคาพอล

2

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

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

ฉันใช้ฟังก์ชั่นเปลือกนี้เพื่อเข้าสู่หน้าจอและแก้ไขถุงเท้า ssh auth:

function sr () { 
    if [ ${+STY} = 1 ] ;then 
            echo already in screen\!
    else
            if [ "${SSH_AUTH_SOCK}x" != "x" ]; then
                    if [ ! -d /tmp/screenssh ]; then
                            mkdir /tmp/screenssh 
                    fi
                    rm -f /tmp/screenssh/socket
                    ln -s $SSH_AUTH_SOCK /tmp/screenssh/socket
                    echo $REMIP > /tmp/screenssh/remip
            fi                
            screen -DR
    fi
}

และฉันมีสิ่งนี้ใน. screenrc ของฉัน:

setenv SSH_AUTH_SOCK /tmp/screenssh/socket

หวังว่านี่จะช่วยได้


การใช้ / tmp หมายความว่าคนอื่น ๆ ในเครื่องสามารถอุดตันไฟล์ใด ๆ ของคุณหากเขารู้เส้นทางของพวกเขา
Blaisorblade

1

ถ้าฉันเข้าใจคุณถูกต้องคุณแค่ต้องการหน้าจอเซสชันซึ่งคุณถอดออกและใส่กลับเข้าไปใหม่บางครั้ง แต่ไม่ต้องการป้อนรหัสผ่านอีกครั้งสำหรับ ssh-agent (รหัสผ่านส่วนตัวของคุณ)

ฉันคิดว่าวิธีที่ง่ายที่สุดคือการเริ่มหน้าจอแทนที่จะเริ่มต้น ssh-agent พร้อมกับ sub shell และจากนั้นอยู่ใน sub sub นั้น กล่าวคือ

screen
ssh-agent bash
ssh-add   # enter your password once

# some commands, some logins and logouts to remote servers via ssh public key

# <ctrl>+<a>, <ctrl>+<d> to detach screen
# you can now logout from this computer
# login again

# reattach to your screen
screen -r
# ssh-agent is still running

นั่นคือสิ่งที่ฉันทำ ฉันใช้หน้าจอเพื่อติดป้ายกำกับหนึ่งใน "แท็บ" ด้านในว่ามีพลัง ssh-agent และใช้มันสำหรับการทำงาน svn ฯลฯ มีรอยย่นพิเศษที่ฉันบังคับให้ ssh-agent อนุญาตอีกครั้งหลังจากผ่านไปหลายชั่วโมง แต่ yup, นี่เป็นพื้นที่ฉันอยู่
Michael H.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.