SSH(Secure Shell)
SSH란 원격에서 서버로 터미널에 접속할때 암호화를 통해 안전한 접속환경을 제공하여 telnet과 같은 안전하지 않은 원격 터미널 접속 프로그램을 보완하는 프로토콜 또는 프로그램입니다. SSH는 기본적으로 포트 22번을 사용합니다.
원격에서 telnet으로 서버에 접속할 경우 암호화 과정을 거치지 않으므로 스니핑을 한다면 계정과 비밀번호가 고스란히 노출됩니다. 하지만 ssh를 사용하여 접속한다면 암호화가 되었기 때문에 스니핑을 하여 패킷을 보더라도 의미를 파악할 수 없습니다. 또한 강력한 인증기능까지 지원합니다.
SSH의 주요 기능은
- 보안 접속을 통한 rsh, rcp, rlogin, rexec, telnet, ftp 등을 제공합니다.
- IP spoofing을 방지하기 위한 기능을 제공합니다.
- X11 패킷 포워딩 및 일반적인 TCP/IP 패킷 포워딩을 제공합니다.
[출저 : 위키백과]
그렇다면 telnet접속과 ssh접속은 어떻게 다른지 눈으로 직접 살펴봅시다.
telnet으로 서버접속( 클라이언트 IP : 110.13.7.47 , 서버 IP : 110.13.7.20)
window 클라이언트에서 cmd에서 telnet을 통해 서버로 접속합니다.
엔터를 치는 순간 네트워크에서는 어떤 페킷이 오고 갔을까요? 아래는 와이어샤크로 본 페킷들입니다. 이 페킷을 보면 localhost login: 이라는 문자열을 볼 수 있습니다.
서버(110.13.7.20)에서 클라이언트(110.13.7.47)로 보내는 군요. 그렇다면 클라이언트의 telnet 터미널 화면은 어떻게 됐을까요?
localhost login: 이라는 로그인 화면으로 들어왔습니다. 그렇다면 위의 페킷은 로그인하라는 디스플레이 메시지를 보냈다는 것을 짐작할 수 있겠군요.
이제 로그인을 시도해보지요. 아이디는 reakwon, 비밀번호는 reakwon입니다. 여기서 클라이언트(110.13.7.47)에서 서버(110.13.7.20)로 보내는 페킷만을 봅시다.
자, r이라는 문자를 보내는 군요. 이후에 75.6.355213의 페킷을 봅시다. r문자를 보낸 이후의 페킷입니다.
e라는 문자가 찍혔네요. 이렇게 reakwon이라는 문자를 서버에 보내고 서버는 그에 대한 응답으로 다시 reakwon이라는 문자를 각각 echo합니다. 이렇게 유저의 계정은 찾을 수 있습니다.
비밀번호 역시 다르지 않습니다. 이후의 페킷을 보면 알 수 있습니다. 다음은 계정의 비밀번호를 알아낼 수 있는 페킷들입니다. 하나씩 보도록 하지요.
페스워드의 시작을 알리는 페킷이 나옵니다.
이후 아까처럼 reakwon의 문자들을 연속해서 서버에 보냅니다. 비밀번호를 입력할땐 서버로 부터 echo가 오지 않는군요.
이제 망했습니다. 해킹당했군요.
ssh로 서버접속( 클라이언트 IP : 110.13.7.47 , 서버 IP : 110.13.7.20)
다음은 ssh로 접속한 페킷들입니다. 대충보아도 서버와 클라이언트의 페킷이 암호화되었다고 하는군요. SSH버전은 2입니다.
페킷 하나를 보면 이렇습니다. 음, 암호화된 페킷을 보면 34e96..., 메시지 인증 코드는 14b4... 입니다.
암호화된 페킷이라 잘 모르겠습니다. 암호화를 하여 데이터를 전송하고 수신하는 것만 알면 되겠습니다.
CentOS7에서 SSH로 서버 접속
CentOS7에서 ssh연결은 다음과 같은 과정을 거치는데요.
1. openssh-server 설치
2. 방화벽 열기
3. 가상머신을 돌릴 경우
1. openssh-server 설치
일단 ssh 서버가 설치되어 있어야합니다. 우선 설치되어 있나 확인을 해봅시다.
[root@localhost etc]# rpm -qa | grep openssh-server
openssh-server-7.4p1-16.el7.x86_64
이미 설치가 되어있군요. 설치가 안된 분들은 설치하면 됩니다.
다음의 명령으로 ssh 서버를 설치하세요.
yum install openssh-server
2-1. 방화벽 포트 열기
CentOS7에서는 기본적으로 방화벽(firewalld)가 설치되어 있습니다. 혹여나 설치가 되어있지 않은 분들은 yum install firewalld 명령으로 방화벽을 설치합시다.
ssh서버와 firewalld가 설치가 되었다면 방화벽에 ssh가 사용하는 포트를 열어줘야합니다. 그래서 /etc/ssh/sshd_config 파일을 열어
(루트 사용자라면 vi /etc/ssh/sshd_config, 아니면 sudo vi /etc/ssh/sshd_config)
#semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
#Port 22 <-- #해제
#AddressFamily any
#ListenAddress 0.0.0.0
에서 #Port 22의 주석을 해제합니다. 앞의 #을 지우게 되면 주석이 해제되는 겁니다. 이 후 sshd을 다시 시작해야되겠죠? 다음의 명령어로 sshd를 다시 시작합시다.
systemctl restart sshd.service
2-2. 방화벽 포트 열기
또는 다른 방법이 있는데요. 다음의 명령으로 방화벽에 명시해줍니다.
sudo firewall-cmd --permanent --add-service=ssh
이후 firewall의 변경사항을 적용하고 싶다면
sudo firewall-cmd --reload
의 명령을 사용한 후 방화벽을 다시 시작해주어야합니다.
sudo systemctl restart firewalld
3. 혹시 가상머신을 사용해서 ssh를 쓰고 계신가요?
그럴 경우 설정-> 네트워크 -> 어댑터 -> 어댑터에 브릿지를 선택해주세요.
연결
자, 이제 putty라는 프로그램 또는 mobaXterm이라는 ssh 프로토콜이 가능한 프로그램을 사용해서 연결해봅시다. 일단 저의 ssh 서버의 주소는 ifconfig라는 명령어로 볼 수 있습니다.
[root@localhost etc]# ifconfig
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.10.123 netmask 255.255.255.0 broadcast 192.168.10.255
...
ssh의 서버주소는 192.168.10.123이군요. 이제 putty라는 프로그램으로 여기에 ssh로 접속해봅시다.
이제 open을 하게 되면 아래 처럼 로그인 화면이 나옵니다. 혹은 첫번째 실행이라면 뭐 yes, no를 묻는 대화창이 나오게 되는데 yes눌르시고 로그인하면 됩니다.
이제 원격에서도 ssh를 통해 서버에 접속 할 수 있습니다.
'컴퓨터 > 운영체제(주로 리눅스)' 카테고리의 다른 글
[리눅스] 소켓(socket) 개념과 예제(connect, bind, listen, accept,send,recv 사용) (0) | 2019.05.23 |
---|---|
[리눅스] 파이프(pipe) 개념과 예제 (3) | 2019.05.19 |
[리눅스] 명령어 pwd, cd, ls 알아보기 (0) | 2019.05.16 |
[리눅스] 스레드(Thread) 개념과 예제(pthread_create, pthread_join, pthread_detach) (2) | 2019.01.06 |
[리눅스] 시그널(Signal) 3 sigpending, sigismember, sigsuspend (0) | 2018.12.31 |