소개
SSH 는 다른 Linux 계정에 암호화된 명령줄 접속을 제공하며, SCP 는 동일한 인증 및 전송 방식을 사용해 파일을 복사합니다. 처음 접속할 때는 서버의 호스트 키를 확인하는 것이 안전하며, 이후에는 계정 비밀번호를 반복해서 입력하는 대신 개인 키를 사용할 수 있습니다.
이 실습에서는 localhost의 격리된 remoteuser 계정을 원격 호스트로 사용합니다. 두 계정이 하나의 실습 VM 을 공유하지만, SSH 프로토콜, 인증 프롬프트, 원격 홈 디렉터리 및 파일 전송은 기본적인 두 호스트 환경과 동일하게 동작합니다. 기본 labex SSH 접속 경로는 변경되지 않습니다.
SSH 대상 확인
이 단계에서는 SSH 클라이언트를 확인하고, 대상 이름을 조회하며, 대기 중인 서버를 확인하고, 서버의 공개 호스트 키를 미리 살펴봅니다.
로컬 작업 공간으로 이동합니다.
cd /home/labex/project/ssh-lab
OpenSSH 클라이언트 버전을 표시합니다. 이 프로그램은 버전을 표준 오류로 출력하므로 2>&1을 사용해 표준 출력과 합칩니다.
ssh -V 2>&1
시스템 이름 서비스 설정을 통해 로컬 대상의 주소를 조회합니다.
getent hosts localhost
SSH 서버가 TCP 포트 22 에서 대기 중인지 확인합니다.
sudo ss -ltnp | grep ':22'
ssh-keyscan은 로그인하지 않고도 공개 호스트 키를 가져옵니다. ED25519 키를 ssh-keygen -lf -로 전달해 지문을 표시합니다.
ssh-keyscan -t ed25519 localhost 2>/dev/null | ssh-keygen -lf -
실제 환경에서는 키를 수락하기 전에 이 지문을 관리자가 제공한 신뢰할 수 있는 값과 비교해야 합니다. 대상 정보를 간단히 정리해 저장합니다.
printf 'target=localhost\nport=22\nuser=remoteuser\n' > ssh-target.txt
cat ssh-target.txt
첫 번째 원격 셸 열기
이 단계에서는 호스트 키를 확인하고, 비밀번호로 인증하며, 원격 계정을 확인한 다음 원격 셸을 종료합니다.
user@host 형식으로 접속합니다.
ssh remoteuser@localhost
설정 과정에서 기존 localhost 호스트 키 기록이 제거되었으므로, SSH 는 표시된 지문을 신뢰할지 묻습니다. 1 단계에서 확인한 지문과 비교한 후 다음을 입력합니다.
yes
비밀번호 입력란이 표시되면 다음을 입력합니다.
RemoteLab123!
입력하는 동안 비밀번호는 화면에 표시되지 않습니다. 로그인 후 프롬프트는 labex가 아니라 remoteuser의 것입니다. 원격 사용자, 호스트 및 현재 디렉터리를 확인합니다.
whoami
hostname
pwd
원격 계정의 홈 디렉터리에 원격 접속 표시 파일을 만듭니다.
mkdir -p ~/ssh-lab
printf 'connected as %s\n' "$(whoami)" > ~/ssh-lab/connected.txt
원격 셸을 종료하고 로컬 labex 프롬프트로 돌아갑니다.
exit
exit 명령은 원격 셸만 종료하며, 로컬 터미널은 계속 열려 있습니다.
원격 명령 실행
이 단계에서는 장시간 유지되는 대화형 셸을 열지 않고 원격에서 명령을 실행한 뒤, 그 결과를 로컬에 저장합니다.
필요한 경우 로컬 작업 공간으로 돌아갑니다.
cd /home/labex/project/ssh-lab
호스트 뒤에 따옴표로 묶은 명령을 입력합니다. SSH 는 해당 명령을 원격에서 실행하고 결과를 로컬 터미널로 반환합니다.
ssh remoteuser@localhost 'whoami; uname -srm; uptime'
비밀번호를 묻는 메시지가 표시되면 RemoteLab123!을 입력합니다. 세미콜론은 원격 셸에서 해석되는 여러 명령을 구분합니다.
두 번째 원격 명령을 실행하고 반환된 결과를 로컬 파일로 리디렉션합니다.
ssh remoteuser@localhost 'printf "remote_user=%s\nremote_home=%s\n" "$(whoami)" "$HOME"' > remote-context.txt
비밀번호를 다시 입력합니다. > 리디렉션은 로컬 셸에서 처리되므로 remote-context.txt는 로컬 작업 공간에 생성됩니다.
cat remote-context.txt
파일에는 remoteuser와 /home/remoteuser가 표시되어야 합니다.
SCP 로 파일 전송
이 단계에서는 로컬 파일을 업로드하고, 원격에서 내용을 확인한 뒤, 새로운 로컬 이름으로 다운로드합니다.
로컬 설정 샘플을 만듭니다.
cd /home/labex/project/ssh-lab
printf 'mode=training\nport=8080\n' > app.conf
SCP 는 원격 경로에 user@host:path 형식을 사용합니다. 준비된 원격 incoming 디렉터리로 파일을 업로드합니다.
scp app.conf remoteuser@localhost:/home/remoteuser/incoming/app.conf
비밀번호를 묻는 메시지가 표시되면 RemoteLab123!을 입력합니다. SSH 를 통해 원격 파일의 내용을 확인합니다.
ssh remoteuser@localhost 'cat /home/remoteuser/incoming/app.conf'
비밀번호를 다시 입력합니다. 이제 원본과 대상의 위치를 반대로 지정해 파일을 다운로드합니다.
scp remoteuser@localhost:/home/remoteuser/incoming/app.conf downloaded-app.conf
비밀번호를 입력한 다음 로컬 원본과 다운로드한 사본을 비교합니다.
cmp app.conf downloaded-app.conf && echo "The files match"
디렉터리를 재귀적으로 전송
이 단계에서는 SCP 의 재귀 모드를 사용해 디렉터리 구조 전체를 원격 계정으로 복사합니다.
작은 로컬 프로젝트 구조를 만듭니다.
cd /home/labex/project/ssh-lab
mkdir -p site/assets
printf '<h1>SSH transfer practice</h1>\n' > site/index.html
printf 'body { color: navy; }\n' > site/assets/style.css
-r 옵션은 디렉터리와 그 안의 내용을 재귀적으로 복사합니다.
scp -r site remoteuser@localhost:/home/remoteuser/incoming/
비밀번호를 묻는 메시지가 표시되면 RemoteLab123!을 입력합니다. 한 번에 실행되는 SSH 명령으로 원격 디렉터리 구조를 나열합니다.
ssh remoteuser@localhost 'find /home/remoteuser/incoming/site -type f -printf "%P\n" | sort'
비밀번호를 다시 입력합니다. assets/style.css와 index.html이 표시되어야 합니다.
개인 SSH 키 생성
이 단계에서는 전용 ED25519 키 쌍을 생성하고 권한과 지문을 확인합니다.
키 쌍은 사용자가 보관하는 개인 키와 원격 계정에 설치할 수 있는 공개 키로 구성됩니다. 자동 검증에서 사용할 수 있도록 암호 문구가 없는 실습용 전용 키를 생성합니다.
mkdir -p ~/.ssh
chmod 700 ~/.ssh
ssh-keygen -t ed25519 -f ~/.ssh/labex_remote_ed25519 -N '' -C 'labex-remote-practice'
-t 옵션은 알고리즘을 선택하고, -f는 파일을 지정하며, -N ''은 실습용 암호 문구를 비워 둡니다. -C는 식별용 설명을 추가합니다. 실제 운영 환경의 키는 자동화상의 제약이 없다면 일반적으로 강력한 암호 문구를 사용해야 합니다.
두 파일과 권한을 확인합니다.
ls -l ~/.ssh/labex_remote_ed25519 ~/.ssh/labex_remote_ed25519.pub
개인 키는 labex 사용자만 읽을 수 있어야 합니다. .pub 파일은 공유하도록 설계된 파일입니다. 공개 키의 지문을 표시합니다.
ssh-keygen -lf ~/.ssh/labex_remote_ed25519.pub
개인 키를 복사하거나 공개하지 마십시오.
공개 키 설치 및 사용
이 단계에서는 remoteuser 계정에 공개 키를 설치하고, 비밀번호 프롬프트 없이 접속한 다음, 키 기반 파일 전송을 확인합니다.
ssh-copy-id는 적절한 권한을 설정하면서 공개 키를 원격 계정의 ~/.ssh/authorized_keys에 추가합니다.
ssh-copy-id -i ~/.ssh/labex_remote_ed25519.pub remoteuser@localhost
이번 비밀번호 인증 작업에서 마지막으로 RemoteLab123!을 입력합니다. -i 옵션으로 전용 개인 키를 사용해 테스트합니다.
ssh -i ~/.ssh/labex_remote_ed25519 remoteuser@localhost 'printf "key authentication works\n" > ~/ssh-lab/key-authenticated.txt; cat ~/ssh-lab/key-authenticated.txt'
이 명령은 원격 계정의 비밀번호를 묻지 않아야 합니다. 같은 키를 SCP 에서도 사용합니다.
scp -i ~/.ssh/labex_remote_ed25519 remoteuser@localhost:~/ssh-lab/key-authenticated.txt key-authenticated.txt
cat key-authenticated.txt
다운로드한 파일에는 key authentication works가 포함되어 있어야 합니다. 호스트 키는 서버를 인증하고, 개인 키는 원격 계정에 접속하는 사용자를 인증합니다. 두 키는 서로 다른 신뢰 문제를 해결합니다.
요약
SSH 호스트 키를 확인하고, 원격 셸을 열고 종료했으며, 한 번에 실행되는 원격 명령을 사용하고 로컬 리디렉션과 원격 실행의 차이를 확인했습니다. 또한 SCP 로 파일을 업로드하고 다운로드했으며, 디렉터리를 재귀적으로 복사했습니다.
이와 함께 전용 ED25519 키 쌍을 생성하고 개인 키를 보호했으며, 공개 키만 설치하고 동일한 키를 비밀번호 없는 SSH 및 SCP 접속에 재사용했습니다. 이는 안전한 초급 원격 관리에 필요한 핵심 기술입니다.



