티스토리 뷰
ssh-keygen
서버에 접속하여 개발하는 사람들은 하나의 서버만 접속하는 일은 별로 없다. 또한 서버를 여러 단계를 거쳐 접속하는 경우도 많다. ssh (혹은 rsh 시절부터) 기반의 접속은 다음과 같은 편리함/불편함의 역사를 가지고 기능이 추가되어 왔다.
- 매번 비밀번호를 입력하는 것이 귀찮다. -> 인증된 서버에서 접속하는 것을 허락해 주시오 (.rhosts, .shosts)
- 인증된 서버가 취약하면 같이 취약하다 -> 인증된 사용자임을 증명(공개키)하면 접속을 허락해 주시오 (ssh-keygen)
- 인증된 사용자의 디렉토리의 비밀키 탈취가 가능하다. -> 비밀키를 passphrase를 넣어서 생성하시오 (ssh-keygen)
- 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
- ssh
- macosx
- JavaScript
- 퀴즈
- TCP/IP
- 구근
- url
- OpenID
- 대화
- 디버깅
- Linux
- Subversion
- Tattertools plugin
- nodejs
- 식물
- 벤자민
- SSO
- VIM
- MySQL
- 덴드롱
- 오픈소스
- 커피
- 수선화
- perl
- 킹벤자민
- BlogAPI
- 클레로덴드럼
- writely
- tattertools
- SVN
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |