SSH를 사용하여 원격 Linux 서버에 연결하기

LinuxBeginner
지금 연습하기

소개

이 실습에서는 SSH(Secure Shell) 프로토콜을 사용하여 원격 Linux 서버에 연결하고 관리하는 데 필요한 핵심 기술을 배웁니다. 먼저 OpenSSH 서버 패키지를 설치하고 구성하여 원격 환경을 설정합니다. 서버가 연결을 수락할 준비가 되면, 클라이언트 머신에서 연결을 설정하는 데 필수적인 단계인 IP 주소를 확인하는 방법을 배웁니다.

서버 구성이 완료되면 SSH를 통한 원격 상호 작용의 두 가지 주요 방법을 연습합니다. 첫 번째는 원격 머신에 대한 완전한 명령줄 액세스 권한을 제공하는 대화형 셸 세션을 설정하는 것입니다. 두 번째는 전체 대화형 세션을 시작하지 않고 원격 서버에서 특정 단일 명령을 실행하는 방법으로, 이는 스크립팅 및 자동화 작업에 매우 효과적인 기술입니다.

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

일부 LabEx 환경에서는 설치 중에 Ubuntu가 서비스 재시작 대화 상자를 표시할 수 있습니다. 이 경우 vncserver를 재시작하지 마십시오. 재시작하면 브라우저 데스크톱 연결이 끊기고 페이지가 회색으로 변할 수 있습니다. 대신 다음 안전한 옵션 중 하나를 사용하십시오.

  • Tab 키를 눌러 <Cancel>을 선택한 다음 Enter를 누릅니다.
  • 또는 Space 키를 눌러 vncserver 선택을 해제한 다음 <Ok>를 선택합니다.

브라우저 데스크톱이 여전히 회색으로 변하면 LabEx 페이지를 새로 고쳐 세션에 다시 연결하고 실습을 계속하십시오.

명령이 완료되면 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 주소를 찾는 방법을 아는 것은 필수적인 기술입니다. Linux에서 이를 위한 최신 명령은 ip입니다.

시스템의 모든 네트워크 인터페이스에 대한 정보를 표시하려면 ip addr 명령을 사용합니다.

ip addr

출력에는 lo(루프백 인터페이스), eth0(기본 이더넷 인터페이스), 그리고 가능하면 docker0(Docker 브리지 인터페이스)와 같은 모든 네트워크 인터페이스가 나열됩니다. 일반적으로 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입니다. 시스템에 Docker가 설치되어 있으면 docker0 인터페이스도 볼 수 있습니다.

머신의 IP 주소만 표시하는 더 간단한 명령은 hostname -I입니다.

hostname -I

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

172.16.50.114 172.17.0.1

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

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

원격 서버에 대한 대화형 SSH 세션 설정

이 단계에서는 ssh 클라이언트를 사용하여 구성한 OpenSSH 서버와 대화형 세션을 설정합니다. 대화형 세션을 사용하면 원격 서버에서 명령줄 프롬프트를 얻을 수 있으므로 물리적으로 로그인한 것처럼 명령을 실행할 수 있습니다.

연결하려면 ssh <user>@<hostname_or_ip> 형식으로 ssh 명령 뒤에 사용자 이름과 서버 주소를 사용합니다. 자신의 머신(localhost)에서 실행 중인 서버에 sshuser 사용자로 연결하므로 IP 주소 127.0.0.1을 사용합니다.

터미널을 열고 다음 명령을 실행합니다.

ssh sshuser@127.0.0.1

새 SSH 서버에 처음 연결할 때 SSH 클라이언트는 서버의 공개 키 지문을 표시하고 진위 여부를 확인하도록 요청합니다. 이는 "중간자(man-in-the-middle)" 공격을 방지하기 위한 보안 조치입니다. 계속하려면 yes를 입력하고 Enter를 누르십시오.

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를 입력하고 Enter를 누르십시오.

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(Secure Shell)를 활성화하고 사용하는 기본 단계를 배웠습니다. 먼저 sudo apt-get update를 사용하여 패키지 리포지토리 인덱스를 업데이트한 다음 openssh-server 패키지를 설치하여 원격 Linux 서버를 준비했습니다. 이 프로세스는 시스템이 들어오는 SSH 연결을 안전하게 수락하도록 구성하고 sshd 서비스를 자동으로 시작했습니다.

다음으로, 기본 labex 사용자는 sudo 권한이 있지만 SSH 연결을 위한 비밀번호가 없기 때문에 SSH 인증 목적으로 알려진 비밀번호(password123)를 가진 전용 사용자 계정(sshuser)을 생성했습니다. 사용자 생성을 확인하고 홈 디렉터리가 제대로 설정되었는지 확인했습니다.

서버와 사용자 계정이 준비된 상태에서 클라이언트가 연결을 시작하는 데 중요한 정보인 서버의 IP 주소를 확인하는 방법을 배웠습니다. 그런 다음 SSH를 사용하는 두 가지 주요 방법인 원격 서버에서 직접 작업하기 위한 전체 대화형 명령줄 세션 설정과 스크립팅 및 자동화 작업에 매우 효율적인 원격으로 단일 비대화형 명령 실행을 연습했습니다.