기본적으로 외부 서버에 ssh 접속을 하게 되면 비밀번호 인증을 하게 된다. 비록 간단하고 단순한 방법이지만, 비밀번호가 네트워크를 통해 교환된다는 치명적인 문제점을 가지고 있다.
이런 위험을 피하고자 공개키와 비밀키를 이용한 "공개키 인증" 방식을 주로 사용한다.
우선 현재 자신의 pc에 공개키와 비밀키 쌍을 생성하여야 한다.
사용자 PC는 Mac OS X 환경, 서버 PC는 Ubuntu 14.04 LTS 환경을 기준으로 작성되었습니다.
$ ssh-keygen
위의 명령어를 실행하면 우선 저장 경로(키 파일 이름도 정할 수 있음)와 passphrase를 물어본다. passphrase는 키를 위한 일종의 비밀번호로 키가 유출되더라도 비밀번호를 모르면 사용할 수 없으므로 조금 더 보안성을 높일 수 있다. 하지만 필수는 아니므로 미입력 후 그냥 Enter 를 눌러도 된다.
절차를 끝내면 [키 이름]
과 [키 이름].pub
이라는 키 쌍이 생성된다. 저장 경로를 별도로 설정하지 않았다면 id_rsa
, id_rsa.pub
라는 이름으로 생성되었을 것이다.
이름에서 알 수 있듯이 .pub
로 끝나는 파일은 공개키 파일이기 때문에 유출되어도 아무 상관없지만, 나머지 하나는 비밀키이므로 절대 유출되어서는 안된다.
이제 이 공개키를 서버에 등록하여야 한다. 이 때 scp 명령어를 이용한다.
$ scp id_rsa.pub jupiny@52.78.151.36:/tmp/
이 공개키를 인증할 때 사용하기 위해 키의 내용을 ~/.ssh/authorized_keys
라는 파일에 추가하여야 한다. 만약 서버에 해당 파일이 없다면 직접 만들도록 한다.
$ ssh jupiny@52.78.151.36
$ cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys
그리고 해당 사용자 외에는 .ssh
디렉토리 내의 모든 파일을 읽고 쓸 수 없도록 권한을 설정한다.
$ sudo chown -R jupiny:jupiny # 소유자를 해당 사용자, 그룹을 해당 사용자 그룹으로 설정
$ sudo chmod 700 ~/.ssh # 소유자만 해당 디렉토리 읽기, 쓰기, 접근 가능
$ sudo chmod 600 ~/.ssh/authorized_keys # 소유자만 해당 파일 읽기, 쓰기 가능
하나의 키에 대해서 특정 명령어만 실행할 수 있게 설정도 가능하다. ~/.ssh/authorized_keys
파일을 연 후,
$ vim ~/.ssh/authorized_keys
아래와 같이 해당 공개키 앞에 특정 명령어열을 추가해주면 된다.
command="scp -f /var/log/access.log" ssh-rsa AAA...
이렇게 설정하면 해당 비밀키로는 /var/log/access.log
파일을 scp
명령어로 복사해오는 것 밖에 하지 못하게 된다.
$ scp -i ~/.ssh/id_rsa jupiny@ 52.78.151.36:/var/log/access.log ~/