SSH 를 이용한 원격 리눅스 서버 접속

LinuxBeginner
지금 연습하기

소개

이 실습에서는 보안 셸 (SSH) 프로토콜을 사용하여 원격 리눅스 서버에 접속하고 관리하는 데 필요한 핵심 기술을 습득합니다. 먼저 OpenSSH 서버 패키지를 설치하고 구성하여 원격 환경을 구축하는 것부터 시작합니다. 서버가 접속을 수락할 준비가 되면, 클라이언트 머신에서 접속을 시도할 때 반드시 필요한 정보인 서버의 IP 주소를 확인하는 방법을 배웁니다.

서버 설정이 완료되면 SSH 를 통한 두 가지 주요 원격 상호작용 방식을 연습합니다. 첫째, 원격 머신의 커맨드 라인에 완전히 접근할 수 있는 대화형 셸 세션을 수립합니다. 둘째, 전체 세션을 시작하지 않고 원격 서버에서 특정 단일 명령만 실행하는 방법을 배웁니다. 이 기술은 스크립트 작성 및 자동화 작업에서 매우 효율적으로 활용됩니다.

이 실습은 학습과 연습을 돕기 위해 단계별 지침을 제공하는 가이드형 실습입니다. 각 단계를 완료하고 실무 경험을 쌓으려면 지침을 주의 깊게 따르십시오. 통계 데이터에 따르면 이 실습은 완료율 99%초급 수준이며, 학습자들로부터 99%의 긍정적인 평가를 받았습니다.

OpenSSH 서버 설치 및 설정

이 단계에서는 시스템이 외부의 SSH 접속을 수락할 수 있도록 OpenSSH 서버 패키지를 설치합니다. SSH(Secure Shell) 는 보안되지 않은 네트워크를 통해 네트워크 서비스를 안전하게 운영하기 위한 암호화 네트워크 프로토콜입니다. openssh-server 패키지에는 SSH 서버를 호스팅하는 데 필요한 핵심 구성 요소가 포함되어 있습니다.

먼저, 최신 버전의 소프트웨어를 설치할 수 있도록 시스템의 패키지 목록을 업데이트하는 것이 좋습니다. labex 사용자는 시스템 전반의 패키지 관리에 필요한 sudo 권한을 가지고 있습니다.

다음 명령을 실행하여 패키지 인덱스를 업데이트하십시오.

sudo apt-get update

저장소에서 패키지 목록을 가져오는 다음과 같은 출력이 표시됩니다.

Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
Get:3 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
...
Fetched 1,845 kB in 2s (1,040 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up-to-date.

이제 apt-get을 사용하여 openssh-server 패키지를 설치할 수 있습니다. -y 플래그는 모든 확인 질문에 자동으로 "yes"라고 응답하여 설치 과정을 중단 없이 진행하게 합니다.

sudo apt-get install -y openssh-server

명령 실행이 완료되면 openssh-server 및 관련 의존성 패키지의 설치와 설정이 완료되었다는 메시지가 표시됩니다.

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  ncurses-term openssh-sftp-server ssh-import-id
...
Setting up openssh-server (1:8.9p1-3ubuntu0.1) ...
...
Creating SSH2 ECDSA key; this may take some time ...
Creating SSH2 ED25519 key; this may take some time ...
...

sshd라는 이름의 OpenSSH 서버 서비스는 설치 후 자동으로 시작됩니다. systemd 시스템 및 서비스 관리자를 제어하는 도구인 systemctl 명령을 사용하여 서비스 상태를 확인할 수 있습니다.

SSH 서비스의 상태를 확인하십시오.

sudo systemctl status ssh

출력 결과에 서비스가 active (running) 상태로 표시되어야 합니다. 이는 SSH 서버가 접속을 받을 준비가 되었음을 의미합니다.

● ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2023-10-30 10:30:00 UTC; 5s ago
       Docs: man:sshd(8)
             man:sshd_config(5)
   Main PID: 1234 (sshd)
      Tasks: 1 (limit: 4617)
     Memory: 1.2M
        CPU: 8ms
     CGroup: /system.slice/ssh.service
             └─1234 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"

...

키보드의 q 키를 눌러 상태 보기 화면을 종료하고 명령 프롬프트로 돌아갑니다.

좋습니다! 이제 시스템에 OpenSSH 서버가 설치되어 실행 중입니다. 다음 단계에서는 SSH 실습을 위한 새 사용자를 생성하고, 서버의 IP 주소를 찾아 접속하는 방법을 배웁니다.

SSH 실습을 위한 새 사용자 생성

이 단계에서는 SSH 접속에 사용할 새로운 사용자 계정을 생성합니다. 기본 labex 사용자는 sudo 권한이 있지만 SSH 인증을 위한 비밀번호를 알 수 없으므로, 이번 실습을 위해 비밀번호를 직접 지정할 수 있는 전용 사용자를 생성해야 합니다.

먼저 adduser 명령을 사용하여 sshuser라는 이름의 새 사용자를 생성합니다. 이 명령은 사용자 계정을 생성하고 비밀번호 및 기타 세부 정보를 설정하도록 안내합니다.

sudo adduser sshuser

새 사용자의 비밀번호를 입력하고 확인하라는 메시지가 나타납니다. 이 실습에서는 비밀번호로 password123을 사용하십시오. 전체 이름, 방 번호 등 추가 정보를 묻는 메시지도 나타나지만, 엔터 (Enter) 키를 눌러 건너뛰어도 무방합니다.

Adding user `sshuser' ...
Adding new group `sshuser' (1001) ...
Adding new user `sshuser' (1001) with group `sshuser' ...
Creating home directory `/home/sshuser' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for sshuser
Enter the new value, or press ENTER for the default
 Full Name []:
 Room Number []:
 Work Phone []:
 Home Phone []:
 Other []:
Is the information correct? [Y/n] Y

이제 /etc/passwd 파일을 확인하여 사용자가 성공적으로 생성되었는지 확인합니다.

grep sshuser /etc/passwd

다음과 유사한 출력이 표시되어야 합니다.

sshuser:x:1000:1000:,,,:/home/sshuser:/bin/bash

이를 통해 sshuser 계정이 /home/sshuser에 홈 디렉토리를 가지고 bash 셸을 사용하도록 생성되었음을 확인할 수 있습니다. 정확한 UID(사용자 ID) 와 GID(그룹 ID) 번호는 시스템의 기존 사용자 상태에 따라 다를 수 있습니다.

사용자의 홈 디렉토리가 생성되었는지도 확인할 수 있습니다. 다른 사용자의 홈 디렉토리에 접근하려면 sudo 권한이 필요합니다.

sudo ls -la /home/sshuser

출력 결과에 사용자의 홈 디렉토리 내용이 표시되어야 합니다.

total 20
drwxr-x--- 2 sshuser sshuser 4096 Jun 30 09:26 .
drwxr-xr-x 5 root    root    4096 Jun 30 09:26 ..
-rw-r--r-- 1 sshuser sshuser  220 Jun 30 09:26 .bash_logout
-rw-r--r-- 1 sshuser sshuser 3771 Jun 30 09:26 .bashrc
-rw-r--r-- 1 sshuser sshuser  807 Jun 30 09:26 .profile

홈 디렉토리의 권한이 제한적 (drwxr-x---) 인 것을 확인할 수 있습니다. 이는 소유자 (sshuser) 와 동일한 그룹의 사용자만 접근할 수 있음을 의미합니다. 따라서 내용을 확인하기 위해 sudo가 필요했던 것입니다.

완벽합니다! 이제 다음 단계에서 SSH 접속에 사용할 비밀번호 password123을 가진 sshuser 계정이 준비되었습니다.

SSH 서버의 IP 주소 확인

이 단계에서는 SSH 서버의 IP 주소를 찾는 방법을 배웁니다. IP 주소는 인터넷 프로토콜을 사용하여 통신하는 컴퓨터 네트워크에 연결된 각 장치에 할당된 고유한 숫자 식별자입니다. SSH 접속을 수립하려면 클라이언트 머신이 접속하려는 서버의 IP 주소를 알고 있어야 합니다.

두 대의 서로 다른 머신을 사용하는 일반적인 시나리오에서는 이 IP 주소를 사용하여 클라이언트에서 접속합니다. 하지만 이 실습에서는 단일 가상 머신이 SSH 서버와 SSH 클라이언트 역할을 동시에 수행합니다. 자신의 머신에서 실행 중인 SSH 서버에 접속하려면 localhost라고도 불리는 특수 IP 주소인 127.0.0.1을 사용할 수 있습니다. 이 주소는 항상 로컬 머신 자신을 가리킵니다.

그럼에도 불구하고 머신의 네트워크 외부용 IP 주소를 찾는 방법을 아는 것은 필수적인 기술입니다. 리눅스에서 이를 확인하는 현대적인 명령은 ip입니다.

시스템의 모든 네트워크 인터페이스 정보를 표시하려면 ip addr 명령을 사용하십시오.

ip addr

출력 결과에는 lo(루프백 인터페이스), eth0(기본 이더넷 인터페이스), 그리고 경우에 따라 docker0(도커 브리지 인터페이스) 와 같은 모든 네트워크 인터페이스가 나열됩니다. 일반적으로 eth0인 기본 네트워크 인터페이스 아래의 inet 항목을 찾으면 됩니다.

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:16:3e:01:82:ae brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname ens5
    inet 172.16.50.114/24 metric 100 brd 172.16.50.255 scope global dynamic eth0
       valid_lft 1892159625sec preferred_lft 1892159625sec
    inet6 fe80::216:3eff:fe01:82ae/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:86:fe:f0:88 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

위의 예시에서 eth0 인터페이스의 기본 IP 주소는 172.16.50.114입니다. 시스템에 도커가 설치되어 있다면 docker0 인터페이스도 보일 수 있습니다.

머신의 IP 주소만 간단히 표시하려면 hostname -I 명령을 사용합니다.

hostname -I

이 명령은 머신의 IP 주소 목록을 공백으로 구분하여 출력합니다.

172.16.50.114 172.17.0.1

출력 결과에 여러 IP 주소가 표시됩니다. 기본 네트워크 인터페이스 IP(172.16.50.114) 와 도커 브리지 IP(172.17.0.1) 입니다.

이제 머신의 IP 주소를 찾는 방법을 알게 되었습니다. 다음 단계에서는 localhost 주소 (127.0.0.1) 를 사용하여 동일한 머신에서 실행 중인 SSH 서버에 접속해 보겠습니다.

원격 서버에 대화형 SSH 세션 수립

이 단계에서는 ssh 클라이언트를 사용하여 앞서 설정한 OpenSSH 서버와 대화형 세션을 수립합니다. 대화형 세션은 원격 서버의 명령 프롬프트를 제공하므로, 마치 서버 앞에 직접 앉아 있는 것처럼 명령을 실행할 수 있습니다.

접속하려면 ssh <사용자>@<호스트이름_또는_IP> 형식으로 ssh 명령을 사용합니다. 여기서는 sshuser 사용자로 자신의 머신 (localhost) 에서 실행 중인 서버에 접속하므로 IP 주소 127.0.0.1을 사용합니다.

터미널을 열고 다음 명령을 실행하십시오.

ssh sshuser@127.0.0.1

새로운 SSH 서버에 처음 접속할 때, SSH 클라이언트는 서버의 공개 키 지문 (fingerprint) 을 표시하고 진위 여부를 확인하도록 요청합니다. 이는 "중간자 공격 (man-in-the-middle)"을 방지하기 위한 보안 조치입니다. yes를 입력하고 엔터를 눌러 계속 진행하십시오.

The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '127.0.0.1' (ED25519) to the list of known hosts.

호스트 키를 확인한 후, 원격 서버의 sshuser 사용자에 대한 비밀번호를 묻는 메시지가 나타납니다. 사용자 생성 시 설정한 비밀번호인 password123을 입력하십시오.

sshuser@127.0.0.1's password:

올바른 비밀번호를 입력하면 로그인이 완료되고 서버의 환영 메시지와 함께 새로운 명령 프롬프트가 나타납니다. 프롬프트 모양이 원격 호스트에 접속했음을 나타내도록 변경된 것을 확인하십시오.

Welcome to Ubuntu 22.04.x LTS (GNU/Linux x.x.x-xx-generic x86_64)

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

sshuser@ubuntu:~$

원격 세션에 있는지 확인하기 위해 현재 작업 디렉토리를 출력하는 pwd와 같은 명령을 실행해 볼 수 있습니다.

pwd

출력 결과에 원격 머신의 홈 디렉토리가 표시됩니다.

/home/sshuser

대화형 SSH 세션을 종료하고 로컬 머신의 셸로 돌아가려면 exit를 입력하고 엔터를 누르십시오.

exit

접속이 종료되었다는 메시지가 표시되고 원래의 명령 프롬프트로 돌아옵니다.

logout
Connection to 127.0.0.1 closed.

이제 대화형 SSH 세션을 성공적으로 수립하고 종료했습니다.

SSH 를 통한 원격 단일 명령 실행

이 단계에서는 전체 대화형 세션을 시작하지 않고 원격 서버에서 단일 명령을 실행하는 방법을 배웁니다. 이는 SSH 의 강력한 기능 중 하나로, 원격 머신에서 정보를 빠르게 가져오거나 작업을 수행한 후 즉시 연결을 끊을 수 있어 스크립트 및 자동화에서 널리 사용됩니다.

구문은 평소 사용하는 ssh 접속 문자열 끝에 실행하려는 명령을 추가하기만 하면 됩니다. 로컬 셸이 명령어를 해석하지 않도록 원격 명령을 따옴표로 감싸는 것이 좋습니다.

원격 서버에서 시스템의 호스트 이름을 출력하는 hostname 명령을 실행해 보겠습니다.

ssh sshuser@127.0.0.1 "hostname"

이전과 마찬가지로 비밀번호 (password123) 를 묻는 메시지가 나타납니다. 비밀번호를 입력하면 원격 서버에서 hostname 명령이 실행되고, 그 결과가 터미널에 출력된 후 SSH 접속이 자동으로 종료됩니다.

sshuser@127.0.0.1's password:
iZrj91w6gb8osv0mra83hdZ

exit를 입력할 필요 없이 즉시 로컬 명령 프롬프트로 돌아온 것을 확인할 수 있습니다.

더 복잡한 명령도 실행할 수 있습니다. 예를 들어, ls -l /를 사용하여 원격 서버의 루트 디렉토리 (/) 내용을 나열해 보겠습니다.

ssh sshuser@127.0.0.1 "ls -l /"

다시 비밀번호 password123을 입력하십시오. 원격 서버의 루트 파일 시스템에 있는 파일과 디렉토리 목록이 길게 출력됩니다.

sshuser@127.0.0.1's password:
total 72
lrwxrwxrwx   1 root root     7 Apr 21  2022 bin -> usr/bin
drwxr-xr-x   4 root root  4096 May 30  2023 boot
drwxr-xr-x  19 root root  4080 Jun 30 09:23 dev
drwxr-xr-x 137 root root 12288 Jun 30 09:26 etc
drwxr-xr-x   5 root root  4096 Jun 30 09:26 home
lrwxrwxrwx   1 root root     7 Apr 21  2022 lib -> usr/lib
lrwxrwxrwx   1 root root     9 Apr 21  2022 lib32 -> usr/lib32
lrwxrwxrwx   1 root root     9 Apr 21  2022 lib64 -> usr/lib64
lrwxrwxrwx   1 root root    10 Apr 21  2022 libx32 -> usr/libx32
drwx------   2 root root 16384 Dec 28  2022 lost+found
drwxr-xr-x   2 root root  4096 Apr 21  2022 media
drwxr-xr-x   2 root root  4096 Apr 21  2022 mnt
drwxr-xr-x   5 root root  4096 Feb 27  2023 opt
dr-xr-xr-x 231 root root     0 Jun 30 09:22 proc
drwx------   8 root root  4096 Jun 30 09:26 root
drwxr-xr-x  35 root root  1060 Jun 30 09:30 run
lrwxrwxrwx   1 root root     8 Apr 21  2022 sbin -> usr/sbin
drwxr-xr-x  10 root root  4096 Feb 18  2023 snap
drwxr-xr-x   2 root root  4096 Apr 21  2022 srv
dr-xr-xr-x  13 root root     0 Jun 30 09:22 sys
drwxrwxrwt  18 root root  4096 Jun 30 09:30 tmp
drwxr-xr-x  14 root root  4096 Apr 21  2022 usr
drwxr-xr-x  13 root root  4096 Apr 21  2022 var

이 방식은 여러 서버를 관리하거나 원격 작업을 로컬 셸 스크립트에 통합할 때 매우 효율적입니다. 이제 대화형 세션과 단일 명령 실행이라는 SSH 의 두 가지 주요 사용법을 모두 익혔습니다.

요약

이 실습에서는 원격 서버 관리를 위해 보안 셸 (SSH) 을 활성화하고 사용하는 기본 단계를 배웠습니다. 먼저 sudo apt-get update를 사용하여 패키지 저장소 인덱스를 업데이트하고 openssh-server 패키지를 설치하여 원격 리눅스 서버를 준비했습니다. 이 과정을 통해 시스템이 외부 SSH 접속을 안전하게 수락하도록 설정되었으며 sshd 서비스가 자동으로 시작되었습니다.

그 다음, SSH 인증을 위해 알려진 비밀번호 (password123) 를 가진 전용 사용자 계정 (sshuser) 을 생성했습니다. 이는 기본 labex 사용자가 sudo 권한은 있지만 SSH 접속을 위한 비밀번호가 설정되어 있지 않기 때문입니다. 사용자 생성을 확인하고 홈 디렉토리가 적절히 구성되었는지 점검했습니다.

서버와 사용자 계정이 준비된 후, 클라이언트가 접속을 시작하는 데 필수적인 정보인 서버의 IP 주소를 확인하는 방법을 배웠습니다. 마지막으로 SSH 를 사용하는 두 가지 주요 방식인 원격 서버에서 직접 작업하기 위한 전체 대화형 커맨드 라인 세션 수립과, 스크립트 및 자동화 작업에 매우 효율적인 비대화형 단일 명령 원격 실행을 연습했습니다.