HomeBlogGuestbookLab 

JDM's Blog

온갖 테스트 결과가 기록되는 이곳은 JDM's Blog입니다. :3

Linux SSH 사용법

이번 포스트는 리눅스(CentOS)에서 SSH의 사용법에 대해 알아보고자 합니다. 간단한 ssh의 설명부터 시작하겠습니다!

SSH?

Secure Shell, or SSH, is a cryptographic (encrypted) network protocol to allow remote login and other network services to operate securely over an unsecured network.

https://en.wikipedia.org/wiki/Secure_Shell

시큐어쉘Secure Shell은 암호화된 네트워크 프로토콜입니다. 일반적으로 암호화 하지 않는 네트워크 위에서 암호화된 접속 및 서비스 사용을 위해 사용합니다. 시큐어쉘을 통한 모든것은 암호화 되어 동작하기 때문에 중간에 메시지를 가로채더라도 원문은 알 수가 없죠.

Linux SSH

그러면 리눅스에서의 SSH는 어떻게 사용할까요? 일반적인 커맨드는 아래와 같습니다.

# 1.
$ ssh user@hostname
# 2.
$ ssh user@127.0.0.1

기본적인 ssh 접속은 위와 같은 ssh 커맨드를 이용하면 됩니다. 접속에 성공하면 그때부터는 원격 호스트의 쉘을 사용하게 됩니다. 언제든지 exit 명령어를 통해 원격 호스트의 쉘을 종료하고 원래의 쉘로 돌아올 수 있습니다.

Linux .ssh Directory

하지만 ssh 접속을 할때 항상 비밀번호를 묻게 되어 있습니다. 신뢰할 수 없는 호스트에 한해서이긴 합니다. 호스트가 한대나 두대 정도라면 일일히 비밀번호를 입력하고 원격 호스트의 쉘로 접속할 수도 있겠지만, 요즘 같은 분산 처리가 흔한 상황이라면 기본적으로 돌리는 호스트 대수는 최소 몇대에서 몇십대에 이릅니다.

효율적인 측면에서 좋지 않습니다. 따라서 ssh로 접속시 비밀번호를 묻지 않게 할 수 있다면 일반적인 쉘스크립트.sh를 만들어서 일괄적으로 처리할 수 있겠죠.

그래서 필요한 것이 소제목에 있던 .ssh 디렉토리입니다. 해당 디렉토리는 모든 계정에 일반적으로 존재합니다.

$ cd ~/.ssh

위처럼 입력하면 .ssh 디렉토리로 이동합니다. 이곳에 특정 파일들이 위치할 수 있습니다. 기본적으로는 아무것도 존재하지 않을 수 있습니다.

위의 디렉토리에서 ls -al 명령어를 실행해봅시다. 파일이 있을 수도 또는 없을 수도 있습니다. 예시 화면은 아래와 같습니다.

drwx------   8 jdm  jdm   272 10 22 14:04 .
drwxr-xr-x+ 33 jdm  jdm  1122 10 27 11:35 ..
-rw-------   1 jdm  jdm  3247  9  2 12:50 id_rsa
-rw-r--r--   1 jdm  jdm   749  9  2 12:50 id_rsa.pub
-rw-r--r--   1 jdm  jdm   749  9  2 12:50 authorized_keys

여기서 보이는 파일들이 흔하게 접할 파일들입니다. 하나씩 알아봅시다.

id_rsa[.pub]

이 파일은 일반적으로 ssh-keygen이라는 커맨드를 통해 만들어집니다. 디폴트 파일명이 id_rsa로 되어 있는 경우가 많습니다. 이 파일을 한번 만들어 봅시다.

$ <span class="light">ssh-keygen</span>
Generating public/private rsa key pair.
(1) 이부분에서 기본 키 위치와 이름을 정할 수 있습니다.
Enter file in which to save the key (/home/jdm/.ssh/id_rsa):
(2) 해당 키를 사용할 때 암호를 지정합니다. (그냥 Enter치면 암호는 쓰지 않는 것입니다. 일반적으론 만들지 않습니다.)
Enter passphrase (empty for no passphrase):
(3) (2)번에서 입력한 암호를 다시 입력합니다.
Enter same passphrase again:
Your identification has been saved in /home/jdm/.ssh/id_rsa.
Your public key has been saved in /home/jdm/.ssh/id_rsa.pub.
The key fingerprint is:
12:23:56:78:90:12:23:ab:cd:ef:e7:d0:b9:02:1c:12 jdm@jdm.kr
The key's randomart image is:
+--[ RSA 2048]----+
|    o*.o.* o     |
|   oE * = %      |
|    *  . * =     |
|     . .. o .    |
|      . S.       |
|         .       |
|                 |
|                 |
|                 |
+-----------------+

주의

위의 예시 화면은 임의로 조작이 되어 있습니다. 그리고 ssh-keygen의 더 좋은 사용법은 아래처럼 옵션을 주는 것입니다.

$ ssh-keygen -t rsa -b 4096 -C "myname@mydomain.com"

조금 더 안전하고 알아보기 쉽게 만들 수 있습니다. -t옵션은 키의 타입을 결정하고 -b옵션은 키를 만들때 bit의 개수입니다. 마지막으로 -C옵션은 해당 키를 알아볼 수 있도록 코멘트를 새로 생성합니다.

쉘에 ssh-keygen 입력 이후 아무런 조작 없이 Enter만 입력했더니 id_rsa 파일과 id_rsa.pub 파일이 생성 되었습니다. 이 파일에서 .pub이 붙어 있는 파일이 공개키가 됩니다. 반대로 다른 하나는 비밀키가 됩니다. 이 파일은 가급적 외부에 공개하지 않는 것이 좋습니다.

또한 이렇게 특정 호스트에 만들어진 파일들은 호스트에 종속적이지 않습니다. 이말의 뜻은 하나의 호스트에서 만든 키를 복사하여 다른 호스트에 놓는다면 해당 호스트도 똑같이 사용이 가능합니다.

따라서 분산 처리를 위해 각 호스트마다 SSH키를 만들기 보다는 하나의 호스트에서 만든 SSH키를 복사하는 것이 효율적일 수도 있습니다. 반대로 보안에 취약해질 수 있어요.

이제 id_rsa.pub의 내부 파일 구조를 봅시다.

$ cat id_rsa.pub
ssh-rsa ...== jdm@jdm.kr

시작은 ssh-rsa이고 마지막은 계정과 호스트가 나옵니다. 이것은 공개키이기 때문에 외부에 노출해도 되지만 시작부터 끝까지 전부 복사해야 합니다.

그럼 id_rsa는 어떨까요?

$ cat id_rsa
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----

공개키와는 확실히 다르고 PRIVATE KEY라고 대문짝만하게 쓰여 있습니다. 신뢰할수 없다면 비밀키는 공개하지 않는 것이 좋습니다.

authorized_keys

이 파일은 현재 자신의 호스트에서 신뢰 할 수 있는 호스트들의 공개키들을 저장합니다. 여기서 신뢰 할 수 있다의 뜻은 비밀번호 없이 자신의 호스트로 접속 할 수 있다는 겁니다. 물론 방화벽이나 iptable같은 것에 막히지 않는다면 말이죠.

따라서 다른 호스트에서 만든 공개키를 그대로 authorized_keys파일 내부에 복사해 넣으면 비밀번호 없이 해당 호스트로 접근이 가능합니다.

$ vi authorized_keys
ssh-rsa ...
....== jdm@jdm.kr
ssh-rsa ...
....== other@other.host

위처럼 여러개의 공개키를 넣어놓을 수 있습니다.

Summary

간단하게 예를 들어봅시다. A호스트와 B호스트가 있다고 가정했을때 A호스트에서 B호스트에 접근하려면 ssh 커맨드를 통해 접속할 수 있습니다.

$ ssh root@B.HOST

위처럼 말이죠. 하지만 이 경우에는 비밀번호를 물어봅니다. 이것을 해결하기 위해서 A호스트의 ssh-keygen으로 만든 공개키를 B호스트의 authorized_keys 파일에 넣으면 됩니다.