SSH (Secure Shell)
: 두 컴퓨터 간의 암호화된 연결을 할 수 있게 해주는 프로토콜
key
: 서버에 접속할때 비밀번호 대신 key를 제출하는 방식. 비밀번호보다 높은 수준의 보안요건을 필요로 할때 사용.
동작 방식
SSH key는 공개키(public key) 와 비공개키(private key)로 이루어진다.
키를 생성하면 공개키와 비공개키가 만들어지고 이중에 비공개키는 로컬머신에, 공개키는 원격 머신에 위치한다.
로컬 머신은 SSH Client, 원격 머신은 SSH Server 가 설치된 컴퓨터를 의미한다.
SSH 접속을 시도하면 SSH Clinet 가 로컬 머신의 비공개키와 원격 머신의 공개키를 비교해서 둘이 일치하는지 확인한다.
간단히 말하면
SSH의 Key는 두 가지가 있음.
Public Key는 외부에 공개되어도 되고, 데이터 암호화에 사용
Private Key는 외부에 공개되어서는 안되고, 데이터 복호화에 사용
>> 이러한 암호화 기능 덕분에 SSH는 외부에서 통신 내용을 Sniffing 해도 암호화된 문자열로 보여지게 됨
기능
Authentication : Clinet-Server 보안 채널이 설정되고, 서버가 먼저 인증 된 후, Client를 인증하기 위한 소프트웨어 호출함
Compression : 데이터를 전송 전에 압축함
Encryption : 압축된 데이터를 대칭키 알고리즘으로 암호화하여 전송함
실습
* 설정 파일을 열때는 관리자 모드로 들어가주어야함 (sudo su)
vi /etc/ssh/sshd_config
# 주요 옵션
Port : ssh가 사용할 기본 포트 지정
PermitRootLogin : root 계정으로서 로그인 허용 여부 (yes : 허용/no : 차단)
PasswordAuthentication : 패스워드를 이용한 인증 허용 여부
AllowUsers / AllowGroups : 지정한 유저 또는 그룹만의 접속 가능 여부
Match : 여러 조건을 조합하여 특정 사용자나 그룹에 대한 설정을 적용할 수 있음
파일 수정 후 적용
: 수정 후 수정 사항을 적용하기 위해서는 ssh 서비스를 재시작해주어야 적용됨
systemctl restart sshd
서비스 상태 확인
systemctl status sshd
서비스 시작, 중지
systemctl start sshd
systemctl stop sshd
SSH 키 생성
ssh-keygen -t rsa -b 4096 -C "SSH_KEY"
: RSA 방식의 SSH 키를 생성하는 명령어이다.
ssh-kengen : SSH 키를 생성하고 관리하며, 변환하는 명령어
-t rsa : RSA 알고리즘을 사용하여 키를 생성하라는 의미
-B 4096 : 키의 길이를 4096으로 설정 (기본적으로 RSA 키는 2048비트로 생성되지만 보안강화를 위해 4096비트로 설정)
-C "SSH_KEY" : 키를 붙일 주석을 지정하는 옵션. "SSH_KEY"라는 주석을 추가한 것
구성 문제
1) 유저 user01 | 포트 2222 | root 로그인 : X
* 기울임꼴로 쓰여진 부분은 파일에서 수정하는 부분임
사용자 생성
sudo adduser user01
user01 만 접속할 수 있도록 허용
AllowUwers user01
포트 변경
Port 2222
root 로그인 비활성화 (root 사용자가 ssh로 접속하지 못하도록 설정)
PermitRootLogin no
변경 사항을 적용하려면 ssh 서비스를 재시작해야한다.
sudo systemctl restart sshd
2) 유저 user02 | 유저 ip 192.168.56.1 | 포트 22022 | 비밀번호로 로그인 안되게
* 기울임꼴로 쓰여진 부분은 파일에서 수정하는 부분임
사용자 생성
sudo adduser user02
포트 변경
Port 22022
비밀번호 로그인 비활성화
PasswordAuthentication no
허용 사용자 및 ip 설정
AllowUwers user02@192.168.56.1
챌린지-응답 인증 비활성화
ChallengeResponseAuthentication no
공개 키 기반 인증 활성화
PubkeyAuthenticaion yes
root 계정으로 ssh 접속 비활성화
PermitRootLogin no
ssh 키 기반 인증 설정
1. 로컬에서 키 생성 (ssh-keygen -t rsa -b 4096 -C "SSH_KEY")
ssh-keygen -t rsa -b 4096 -C "user02_key"
2. 공개 키를 서버로 복사 (ssh-copy-id -i ~/.ssh/id_rsa.pub <유저이름>@<서버 ip 주소>)
ssh-copy-id -i ~/.ssh/id_rsa.pub -p 22022 user02@192.168.56.1
ssh 서비스 재시작
sudo systemctl restart sshd
최종 테스트
ssh user02@192.168.56.1 -p 22022
>> 비밀번호가 아닌 ssh 키를 사용하여 접속된다
# 포트 오류 정리
원격 서버의 포트 22022에서 ssh 연결이 이루어지지 않는 문제를 의미한다
"Connection refused"는 원격 서버에서 해당 포트가 열려 있지 않거나 ssh 데몬이 해당 포트에서 동작하지 않는 경우에 발생한다.
1. 원격 서버의 ssh 설정을 확인
1) vi /etc/ssh/sshd_config 파일에서 포트가 제대로 설정되어 있는지 확인한다
2) 설정을 확인 또는 수정한 후 ssh 서비스를 재시작한다.
sudo systemctl restart sshd
2. 포트가 방화벽에서 열려 있는지 확인
1) 방화벽 상태 확인
sudo ufw status
sudo ip tables -L (필요한 경우)
2) 22022 포트 열기 (방화벽에서 포트를 허용한다)
sudo ufw allow 22022/tcp
sudo ufw reload
sudo iptables -A INPUT -p tcp --dport 22022 -j ACCEPT
sudo iptables-save

3. ssh 데몬이 22022 포트를 리스닝 중인지 확인
sudo ss -tuln | grep 22022

4. ssh 데몬 상태 확인
sudo systemctl status sshd

5. 원격 서버 ip 확인
ip a

1) enp0s8 인터페이스 활성화
sudo ip link set enp0s8 up
2) ip 주소 수동 할당
sudo ip addr add 192.168.56.1/24 dev enp0s8
확인
ip a


>> 음 그냥 오류가 아니라 단순히 키가 이미 존재한다는 경고였음...
걍 사용하면 된다고 한다....
ssh 키가 제대로 동작하는지 확인하려면 ssh로 접속을 시도해보자!
ssh user02@192.168.56.1 -p 22022

ssh 를 통해 원격 서버 (192.168.56.1, 포트 22022)에 접속되었으며 서버는 Ubuntu 24.04 LTS에서 실행 중임을 확인할 수 있다.
또한, 접속 후 서버의 기본 정보가 표시되고 있다.
>> ssh 키 기반 인증이 성공적으로 작동함. 원격 서버에 명령을 실행할 수 있음
3) 포트는 2202, 2022 두개 | 루트로 접근 안됨 | 기본적으로 키 기반 인증만 허용
| 사용자 제한 - user03@<client ip>, user04는 비밀번호 접속가능, 이외 전부 비활성화
* 기울임꼴로 쓰여진 부분은 파일에서 수정하는 부분임
사용자 생성
sudo useradd user03
sudo useradd user04
user04만 비밀번호 인증 활성화
# 오류 발생

UsePAM 은 전역 설정으로만 사용할 수 있으며, 사용자별 Match블록 안에 넣을 수 없다고 한다...
>> 걍 지워줌
>> 또 에러 뜨길래 걍 위로 올려줌


>> 여기에서 배운 점
설정 파일 테스트 명령어
sudo sshd -t
ssh 서비스 재시작
sudo systemctl restart sshd
방화벽 설정
sudo ufw allow 2202/tcp
sudo ufw allow 2022/tcp
테스트
1. user03 테스트 : 특정 ip 에서만 접속 가능한지 확인
ssh user03@192.168.56.1 -p 2202
>> 수동 설정으로 해결
sudo ip addr add 192.168.56.17/24 dev enp0s8
여러 에러들이 발생함...
따로 공부해서 정리할 것
1. 키 기반 인증 확인 (공개키?...)
2. 방화벽 (ufw 가 뭘까?...) (netstat -tuln | grep 2202)