본문 바로가기

About/Linux

[Linux] Ubuntu에서 OpenSSH(openssh-client, openssh-server) 사용

이번 글에서는 Linux 환경에서 OpenSSH를 설치하고 활성화되었는지 확인해보겠습니다.

또한 OpenSSH를 활성화 시킨 후 OpenSSH를 이용하여 원격 서버에 로그인 세션을 여는 방법을 다뤄보겠습니다.

 


OpenSSH 패키지

 

OpenSSH 동작 구조

다음 그림 처럼 원격 서버에 로그인할 때 로컬 PC원격 서버의 클라이언트로 작동하므로 로컬 PC에서는
openssh-client 패키지를 사용한다.

그러나 로그인할 원격 서버의 OS는 셸 세션의 호스트로 작동하므로 openssh-server 패키지를 실행해야한다.

 

OpenSSH 설치 및 실행

 

OpenSSH가 설치되어있지 않다면 다음 명령어를 통하여 설치할 수 있습니다. (클라이언트 혹은 서버)

 

apt install openssh-server

혹은

apt instasll openssh-client

하지만 배포판 리눅스의 대부분은 최소한의 SSH 기능을 기본으로 설치하기 때문에 dpkg 패키지 관리자를 통하여 확인해 보겠습니다.

 

dpkg는 APT 시스템에 속한 소프트웨어 패키지들을 관리하고 상태를 확인하는 명령어 입니다.

-s 옵션으로 설치 및 업데이트의 상태까지 출력할 수 있습니다.

dpkg -s openssh-server

혹은

dpkg -s openssh-client

 

서버 버전에는 클라이언트 패키지에 있는 도구도 모두 들어 있습니다.

즉, openssh-server 패키지가 설치된 컴퓨터에서는 ssh로 다른 서버에도 로그인할 수 있습니다.

(보안 모범 사례에 인프라에 대한 접근 경로는 절대적으로 필요한 곳으로만 제한해야하므, 데스크톱이나 노트북 등 로그인할 필요가 없으면 openssh-client만 설치해야 합니다.)

 

ssh가 활성화 되어 있어야 OpenSSH를 사용할 수 있으므로, systemctl status 명령어로 컴퓨터에서 SSH가 실행 중인지 확인할 수 있습니다.

systemctl status ssh

 

Active : active (running) 으로 되어있으므로 현재 SSH는 실행 중이며, 할당된 PID 는 1201인 것을 확인할 수 있습니다.

 

만약 SSH가 실행되고 있지 않으면 다음 명령어를 통하여 실행시킵니다.

systemctl start ssh

 

사용이 끝나고 프로세스를 종료시킬 때는 다음 명령어를 입력합니다.

systemctl stop ssh

SSH 같은 서비스를 시스템이 부팅될 때 자동으로 실행되게 할 수 있는데, system enable 명령어를 사용합니다. 반대로 비활성화 할때는 systemctl disable ssh 명령어를 사용합니다.

systemctl enable ssh

 

SSH로 원격서버에 로그인하기

우선 접속할 컴퓨터의 IP 주소를 확인합니다. LXC 컨테이너를 사용하고 있다면, lxc-ls --fancy 명령어로 필요한 정보를 얻고, Docker container를 사용하고 있다면 Docker inspect 명령어를 통해 확인합니다. 또는 서버에 로그인한 상태라면
ip addr 명령어로 현재 컴퓨터의 ip 주소를 가져올 수 있습니다.

 

저는 LXC 컨테이너가 실행 중이므로 LXC 컨테이너에 접속해보겠습니다.

먼저 ip를 확인합니다.

# sudo lxc-ls --fancy
NAME        STATE   AUTOSTART GROUPS IPV4       IPV6
myContainer RUNNING 0         -      10.0.3.179 -

 

접속할 ip주소는 10.0.3.179 입니다.

이제 서버의 IP 주소와 서버에 로그인할 계정명과 함께 ssh 명령어를 실행하면 됩니다. 

서버에 처음으로 접속한다면 서버의 OpenSSH 프로그램이 보낸 정보가 맞는지 확인하고 'yes'를 입력해야합니다.(정확하게 입력해야합니다.) 그 후 지정한 서버 계정의 패스워드를 입력하면 됩니다.

 

결과

# ssh ubuntu@10.0.3.179
The authenticity of host '10.0.3.179 (10.0.3.179)' can't be established.
ECDSA key fingerprint is SHA256:aJhHRKVBBQyYKQiNKthD/zn0SlWFuDkjfqlo2+sFLNM.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.3.179' (ECDSA) to the list of known hosts.
ubuntu@10.0.3.179's password:
Welcome to Ubuntu 16.04.7 LTS (GNU/Linux 4.4.0-176-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

ubuntu@myContainer:~$ ^C

4번째 줄에서 yes를 입력하였고, 6번째 줄에서 password 입력 후 ssh 로그인이 되어 ubuntu@myContainer로 프롬프트 변경된 것을 확인할 수 있습니다.

 

이후 ip addr 명령어를 입력하면, 위에서 접속 시도한 ip주소가 eth0에 나타나는 것이 확인됩니다.

 

 

패스워드 없이 SSH 접근하기

SSH의 패스워드 인증 대안으로 특별한 키 쌍을 생성한 다음 로그인하려는 원격 호스트에 공개 키를 복사하는 방법이 있습니다. 암호화 키가 연결의 양쪽 끝에 있으므로 호스트에 실행되는 OpenSSH는 패스워드 없이 로그인하려는 사용자가 누구인지 알 수 있습니다.

 

인프라에서 패스워드가 긍정적인 역할을 하지 않는 것은 아닙니다. 이상적으로는 키 쌍을 사용하기전에 로컬에서 패스프레이즈(passphrase)라는 것을 생성하고 이것을 이용하여 인증하여야 합니다.

 

여기서는 ssh-keygen 을 통하여 키 페어를 생성하겠습니다. ssh-keygen을 입력하면 RSA 암호 알고리즘을 기반에 둔 공개 키와 개인 키 쌍을 생성합니다. Enter를 눌러 기본 이름을 사용하면 id_rsa라는 이름의 키쌍이 생성됩니다.

 

ssh-keygen

 

ssh-keygen 결과

이제 ls -l 명령어를 이용하여 .ssh 디렉토리 내용을 살펴보면 id_rsa파일이 생성됩니다. 이 중 하나에는 .pub 파일 확장자가 붙어 있는데, 이 파일이 키 쌍의 공개 키 부분이며, 이 파일을 로그인할 원격 서버에 복사해야합니다.

ls -l .ssh

 

ls -l .ssh 결과

이제 이 공개 키를 호스트에 복사해야합니다. 일반적으로 키 쌍은 클라이언트에서 생성합니다. 이 키쌍의 공개키를 호스트의 .ssh/authorized_keys 파일로 복사하면 클라이언트에서 개인 키로 서명한 암호 메시지가 진짜인지 실행되는 OpenSSH가 검증할 수 있습니다. 메시지가 검증되면 SSH 세션이 시작됩니다.

 

우선 공개키를 /home/ubuntu 디렉토리의 .ssh 디렉토리에 복사해야 하는데, .ssh 디렉토리가 없으면 mkdir 명령어로 생성합니다.

# ssh ubuntu@10.0.3.179 mkdir -p .ssh
ubuntu@10.0.3.179's password:

 

이제 다음 명령어를 입력하여 local의 키파일ssh를 통하여 host .ssh/authorized_keys라는 파일에 추가해줍니다.

 

cat .ssh/id_rsa.pub \
| ssh ubuntu@10.0.3.179 \
"cat >> .ssh/authorized_keys"

ubuntu@10.0.3.179's password:

cat 명령어를 읽어 ssh를 통하여 로그인 후 파이프로 전달합니다. 마지막으로 원격에서 다시 읽고 이를 authorized_keys라는 파일에 추가합니다.

 

파일이 정상적으로 생성되었다면, 이제 기존의 ssh 명령어를 실행할 때 패스워드 입력하지 않아도 됩니다.

 

 

password를 입력하지않고 컨테이너에 접근된 모습

 

다중 암호화 키를 이용할 경우 ssh의 -i 플래그 뒤에 개인 키 파일의 이름과 위치를 지정하면 됩니다.

 

AWS EC2에서는 .pem 확장자 파일을 이용하므로 .pem 키 파일을 추가하는 예시는 다음과 같습니다.

ssh -i .ssh/mykey.pem ubuntu@10.0.3.179

Linux에서 OpenSSH를 사용하는 법을 다루어 보았습니다.