오호라. 있었다.
그리고, 저 정도까지 설명하는건 나한테는 조금 무리인듯 하다.
사실, 조금 부럽다. ㅠ_ㅠ
어쨌거나 몇가지를 덧붙여서 (억지로 ㅠ_ㅠ;;) 문서를 만들고자 한다. (사이트가 접근 안될수도 있잖아! 억지억지 ~_~)
아래는 rsa와 dsa로 key를 만드는 예이다. (linux에서 작업했다.)
elenoa# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/elenoa/.ssh/id_rsa):
Created directory '/home/elenoa/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/elenoa/.ssh/id_rsa.
Your public key has been saved in /home/elenoa/.ssh/id_rsa.pub.
The key fingerprint is:
5c:cd:f0:fc:23:89:65:99:7e:ad:ff:14:41:60:ff:22 elenoa@elenoa.com
elenoa#
elenoa# ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/elenoa/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/elenoa/.ssh/id_dsa.
Your public key has been saved in /home/elenoa/.ssh/id_dsa.pub.
The key fingerprint is:
9a:71:07:60:77:2e:4b:a2:da:80:54:47:85:ef:cd:74 elenoa@elenoa.com
elenoa#
중간에 패스워드를 입력하게 되어 있다. 패스워드를 입력하지 않으면 해당 키를 원하는 서버에 까는 순간 무소불위의 접속 키로 둔갑하게 된다. 조금이라도 보안을 생각한다면 그렇게 하지는 말자.
생성 이후 생성된 key를 살펴보면 이렇게 되어 있다.
elenoa# cd ~elenoa/.ssh/
elenoa# ls
id_dsa id_dsa.pub id_rsa id_rsa.pub
elenoa#
id_dsa와 id_rsa가 두쌍으로 만들어져 있다. .pub가 붙어있는 물건이 public key이고, .pub가 없는 물건이 private key이다. 위의 key 파일의 내용은 바이너리가 아니라 텍스트로 되어 있으므로, 살짝 편집해도 무방하다. (pubkic key 내용 안에, 생성된 서버와 계정 이름이 들어가 있다)
해당 .pub 내용을 원하는 서버의 원하는 계정의 루트 경로 아래 .ssh/authorized_keys 파일 안에 덧붙인다. 요거, 중요하다. 특정 서버의 특정 계정은 1개 이상의 인증 파일로 접근이 가능하다는 의미이다.
여기까지 끝낸 이후, private key를 가진 서버(의 계정)에서 public key를 복사한 서버(의 계정)로 접근하려고 하면 아래와 같은 메시지를 볼 수 있다.
elenoa# ssh -l elenoa 192.168.0.203
Enter passphrase for key '/home/elenoa/.ssh/id_rsa': (key에 대한 패스워드를 입력하지 않으면 일반 패스워드 입력으로 넘어간다.)
Password:
Password:
Password:
Permission denied (publickey,keyboard-interactive).
elenoa#
Enter passphrase for key ... 단계에서 인증키를 생성했을 때 당시 만들었던 패스워드를 입력하게 되면 인증을 통과할 수 있다.
여기서 끝이라면 자동화 스크립트를 만들 수 없기 때문에 다음 단계로 넘어가자.
ssh-agent를 사용하는 것인데, 이것을 사용하게 되면 ssh와 scp를 연결할때마다 인증키의 패스워드를 입력하지 않도록 암호를 저장할 수 있다.
elenoa# eval `ssh-agent`
Agent pid 38989
elenoa# ssh-add
Enter passphrase for /home/elenoa/.ssh/id_rsa:
Enter passphrase for /home/elenoa/.ssh/id_dsa:
elenoa#
ssh-add는 위와 같이 .ssh 아래에 id_dsa 혹은 id_rsa가 존재한다면 해당 key를 리스팅하고 key에 대한 패스워드 입력을 대기한다. 해당 key를 사용하지 않으려면 enter를 누른다. ssh-add (키 경로) 로 특정 위치의 key를 사용하게 할 수도 있다.
패스워드가 정상적으로 입력되면 아래와 같은 메시지를 볼 수 있다.
elenoa# ssh-add
Enter passphrase for /home/elenoa/.ssh/id_rsa:
Identity added: /home/elenoa/.ssh/id_rsa (/home/elenoa/.ssh/id_rsa)
elenoa#
elenoa# (자, 이제 로긴해보자!)
elenoa# ssh -l elenoa 192.168.0.203
Last login: Wed Jul 4 14:00:36 2007 from 192.168.0.208 (어머 통과했네 ~_~)
(... 하략)
자, 이제 당신의 shell은 저 key와 쌍이 되는 public key를 가진 모든 계정들에 대해서, ssh를 통한 무소불위의 접근 권한을 가지게 되었다. (ssh, scp 등 secure socket 어플리케이션은 모두 통과 가능하다.) 이 접근 권한은 해당 쉘에서만 허용되며, 다른 쉘에서는 ssh-agent를 다시 실행해줘야 한다.
추가. 위와 같은 작업을 한 특정 서버의 특정 계정에 ssh 접근이 자동화되지 않는다면, 해당 계정의 .ssh 디렉토리의 접근 권한과 소유 권한을 확인하자. 해당 유저의 소유로써 700의 접근 권한을 가지고 있어야 한다.
자, 이런 세팅 후에 주로 이런 스크립트를 만들어서 돌리곤 한다. 간단한 예제를 보자. 아래는, 음, 편의상 a.sh의 내용이라고 하자.
#!/bin/sh
ssh -l root -n $1 "ps -ax | grep httpd | wc -l"
아래는 run.sh의 내용이라고 하자.
SERVERS="192.168.0.100 192.168.0.101"
for i in $RCTS; do
echo "SERVER $i RUNNING..."
./$1 $i
done;
자, 대략 짐작이 갈지도 모르겠지만, 이것은 이렇게 연결이 된다.
elenoa# ./run.sh a.sh
SERVER 192.168.0.100 RUNNING...
7
SERVER 192.168.0.101 RUNNING...
9
elenoa#
그러니까, 같은 구성으로 같은 역할을 하는 여러가지 다른 서버에 모두 같은 명령을 내릴때 주로 저런 커맨드를 사용했다. 하지만 각 서버에 key가 설치되어 있어야 하고, 여러가지 경우에 보안이 문제가 되는 경우가 있다. 그런 경우에는 다음에 소개할 expect를 쓰는 것도 좋은 선택일 것 같다.