티스토리 뷰

ssh-keygen

서버에 접속하여 개발하는 사람들은 하나의 서버만 접속하는 일은 별로 없다. 또한 서버를 여러 단계를 거쳐 접속하는 경우도 많다. ssh (혹은 rsh 시절부터) 기반의 접속은 다음과 같은 편리함/불편함의 역사를 가지고 기능이 추가되어 왔다.

  1. 매번 비밀번호를 입력하는 것이 귀찮다. -> 인증된 서버에서 접속하는 것을 허락해 주시오 (.rhosts, .shosts)
  2. 인증된 서버가 취약하면 같이 취약하다 -> 인증된 사용자임을 증명(공개키)하면 접속을 허락해 주시오 (ssh-keygen)
  3. 인증된 사용자의 디렉토리의 비밀키 탈취가 가능하다. -> 비밀키를 passphrase를 넣어서 생성하시오 (ssh-keygen)
  4. passphrase 를 매번 입력하는 것이 귀찮다(1번!) -> 개인키 캐시를 이용하시오 (ssh-agent)

github, bitbucket, gitlab 등에선 ssh-keygen으로 생성된 공개키 기반으로 접속하는 것을 권장하며, 공개키를 개발하는 서버마다 생성하여 여러개를 추가하거나, 하나의 공개키를 각 서버마다 복사해서 사용하기 마련이다. 이렇게 사용하다 보니 하나만 유출이 되어도 소스에 접근이 가능하므로 보안상 문제가 생길 수 있어서 ssh-agent 를 사용하게 된다.

ssh-agent

키보드가 연결된 메인 컴퓨터가 맥이라면, 이미 ssh-agent를 사용하는 것이 매우 쉬운 상태로 준비 돼 있다. ssh-agent 는 Launchd의 Agent 로 등록되어 있어 필요시에 자동으로 실행되도록 설정돼 있으므로, ssh-agent 의 일반적인 방법을 따르지 않아도 된다. (맥에서는 사용자 로그인 없이도 실행되는 서비스와 사용자 로그인 후에 실행되는 서비스를 각각 Daemon과 Agent라고 부른다) ssh를 처음 실행했다면 부팅을 한 번 정도 해야 Launchd에서 서비스가 원활하게 될 수도 있다. 맥에서 관련 설정 파일을 보자.

$ plutil -p /System/Library/LaunchAgents/com.openssh.ssh-agent.plist
{
  "EnableTransactions" => 1
  "Label" => "com.openssh.ssh-agent"
  "ProgramArguments" => [
    0 => "/usr/bin/ssh-agent"
    1 => "-l"
  ]
  "Sockets" => {
    "Listeners" => {
      "SecureSocketWithKey" => "SSH_AUTH_SOCK"
    }
  }
}

Launchd가 관리하는 ssh agent 설정 파일은  위 plist 파일이며, 다음 매뉴얼을 통해 해석하자면 이렇다.

"man launchd.plist"

"Sockets => Listeners" 값은 launchd 가 Agent 대신 소켓을 만들어 Listen을 한 다음 뭔가 접속이 들어 오면 바로 실행하여 제어권을 넘긴다는 뜻이다. 그런데 여기선, "SecureSocketWithKey" 를 사용하는데, 이것은 유닉스 소켓을 랜덤하게 만들고 그 경로를 launchd의 환경변수 SSH_AUTH_SOCK에 저장한다는 뜻이다. 이 소켓의 경로를 보려면 다음과 같이 한다.

$ launchctl getenv SSH_AUTH_SOCK
/private/tmp/com.apple.launchd.9ObewQ1C4j/Listeners

$ ls -al /private/tmp/com.apple.launchd.9ObewQ1C4i/Listeners
srw-rw-rw-  1 pynoos  wheel  0 Jan  9 01:27 /private/tmp/com.apple.launchd.9ObewQ1C4j/Listeners

/private/tmp/com.apple.launchd.XXXXXX/Listeners 와 같은 형식으로 되어 있다. 이 소켓에 어떤 접속이 일어나면 그때 ssh-agent가 자동으로 실행된다. launchctl 을 통해서 launchd가 가지고 있는 환경변수를 알 수 있으며 여기까지는 ssh-agent와 전혀 상관없이 일어나는 일이다.

사용자가 터미널을 실행하면 launchd는 사용자의 로그인 쉘을 실행하면서 해당 환경변수를 넘겨준다.

$ export | grep SSH_AUTH_SOCK
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.9ObewQ1C4j/Listeners

위와 같은 값이 나오지 않았다면, launchd가 부팅할 때 ssh-agent에 대한 설정이 바르게 되어 있지 않은 경우이다. 이 소켓은 ssh, ssh-add 등의 명령으로 접속이 가능하므로, 한 번이라도 실행한다면, 바로 launchd는 위 plist 파일의 설정 대로 /usr/bin/ssh-agent 를 실행한다.

ssh-agent -l (el)

다시 한 번 launchd 설정파일인 "/System/Library/LaunchAgents/com.openssh.ssh-agent.plist"의 내용을 보면, 실행 옵션으로 -l 을 주는데, 이것은 ssh-agent의 정식 옵션은 아니고, macos 가 배포할 때 자사의 서비스와 연동을 하기 위한 옵션이다. 따라서 매뉴얼인 "man ssh-agent"에도 나오지 않는다. 이 옵션은 아마 launchd 로부터 물려 받은 socket을 그대로 사용할 수 있도록 하는 애플에서 수정한 옵션이다.

공개키 접속

공개키를 이용하여 ssh를 사용할 때는 설정이 전혀 어렵지 않은 ssh-agent를 이용하는 것을 권장한다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함