리눅스 시스템에 접근하기 위한 방법은 직접 로컬 PC에서 터미널이나 그래픽 인터페이스 등을 활용하여 작업을 진행하는 것과, 원격지에서 호스트 접속을 위한 프토로콜을 사용한 연결이 있습니다. 리눅스 시스템에 원격으로 접속하기 위해 작업 방식에 따라 다양한 프로토콜을 사용해볼 수 있습니다. 예를 들어 그래픽 데스크톱 환경을 원격지에서 사용하기 위해서는 XRDP나 XDMCP, VNC 등의 프로토콜을 사용합니다.
터미널을 사용하기 위해서는 SSH나 TELNET 등을 사용하여 접속합니다. SSH와 TELNET을 사용하면 명령 셸인 sh나 bash 등을 사용하여 원격지에 명령어를 보낼 수 있습니다.
SSH에 대한 자세한 내용은 다음 포스트에 정리되어 있습니다.
SSH Server 설치
원격 서버에 SSH 프로토콜을 사용하여 터미널에 접속하려면 아래와 같은 조건이 필요합니다.
- 22번 tcp 포트가 방화벽에서 열려있어야 합니다.
- SSH 서버 프로그램이 설치 및 구동되고 있어야 합니다.
- SSH 프로토콜로 접속할 수 있는 SSH 클라이언트가 필요합니다.
먼저 해당 서버의 설치 장소에 따라 SSH 서버의 기본 설치 여부가 나뉘어집니다.
예를 들어 카페24, 고대디, 가비아 등의 호스팅 서비스나 AWS, Azure, 구글 클라우드와 같은 클라우드 서비스를 사용 중인 경우 SSH 서비스를 기본 설치 된 상태로 제공하기 때문에 SSH 서버 설치 과정을 진행하지 않아도 접속이 될 것입니다. 22번 포트 개방도 마찬가지로 허용 상태일 것입니다. 이 경우 하단의 ‘SSH 접속’ 부터 진행해주시면 됩니다.
직접 OS를 설치했거나 서버 관리자가 원격 접속을 사용하지 않아서 해당 서버에 SSH 접속 환경이 구축되지 않았다면, 해당 PC에 원격지에서 접속할 수 있는 방법이 없기 때문에 SSH 서버 설치를 진행해야 합니다.
리눅스 대부분의 최신 배포판들은 SSH 서버를 기본적으로 탑재했을 수 있습니다. 터미널에서 rpm
명령어로 openssh-server를 검색하여 결과가 나온다면, SSH 서버가 설치되어 있으므로 다음 과정으로 건너뛰어도 됩니다.
[root@localhost ~]# rpm -qa | grep openssh-server openssh-server-7.4p1-16.el7.x86_64
먼저 SSH 접속 대상이 되는 서버 PC에 직접 로그인한 후, 해당 운영체제의 터미널을 열어주세요. 아래는 CentOS 7 기준 터미널을 여는 방법입니다.
터미널이 열렸다면, 패키지 관리자를 통해 다음 패키지를 설치해야 합니다. 아래 과정은 root 권한으로 진행해야 합니다.
- CentOS, RedHat Enterprise Linux (yum 패키지 관리자인 경우)
yum install openssh-server
- Ubuntu, Debian (apt 패키지 관리자인 경우)
apt install openssh-server
설치가 완료되었다면 다음과 같이 나타날 것입니다. (아래는 yum 일 때의 결과입니다.)
Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : openssh-server-7.4p1-16.el7.x86_64 1/1 Verifying : openssh-server-7.4p1-16.el7.x86_64 1/1 Installed: openssh-server.x86_64 0:7.4p1-16.el7 Complete! [root@localhost ~]#
which
명령어를 사용하여 설치가 완료되었는지 확인해볼 수도 있습니다.
[root@localhost ~]# which sshd /sbin/sshd
SSH 접속을 위한 설정
SSH 서버를 구동하기 전, 방화벽 프로그램에서 tcp 포트 22번을 허용해주어야 합니다. 운영체제 마다 기본으로 사용되는 프로그램이 다를 수 있으므로 구동되고 있는 방화벽이 어떤 것인지 확인한 후 아래 각 방화벽 프로그램 별 명령어를 입력해주세요. 아래 과정은 모두 root 권한으로 진행합니다.
iptables의 경우
[root@localhost ~]# iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
firewalld의 경우 (예 : CentOS 7 이상)
[root@localhost ~]# firewall-cmd --zone=public --add-port=22/tcp --permanent
ufw의 경우 (예 : Ubuntu)
[root@localhost ~]# ufw allow 22/tcp
SSH 서버는 /etc/sshd/sshd_config
라는 설정 파일을 참조합니다. 이 파일은 SSH 프로토콜 접속 시의 규칙을 지정하거나 서버의 연결 설정을 정의할 수 있습니다. 예를 들면 아래와 같은 내용을 편집할 수 있습니다.
- SSH 포트 변경
- 접속 허용 클라이언트 및 패스워드 입력 시도 횟수 제한 설정
- 패스워드, 공개 키 사용자 인증 설정
- 접속 로그, 배너 메세지
접속만 한다고 가정할 때, 이 파일을 특별히 수정해야 되는 것은 없습니다. 그러나 만약 패스워드가 아닌 공개 키만 접속을 허용한다던지 무분별한 접속 시도를 방지하고자 할 때에는 이 파일의 내용을 수정해주여야 합니다.
보안을 위해 몇가지만 살펴보도록 하겠습니다. sshd_config 파일을 텍스트 파일 편집기로 열어줍니다.
[root@localhost ~]# vim /etc/ssh/sshd_config
먼저 root 계정에 대한 직접적인 로그인을 차단하는 방법입니다. 보안상 root 계정은 되도록 접속하지 않는 것이 좋습니다. 해당 계정을 일반 사용자를 경유하여 접속하는 것이 좋으며 직접적으로 접속하게 되는 것을 차단하여 접속 경로를 조금이나마 차단할 수 있습니다.
sshd_config 파일에서 다음 부분을 찾습니다.
#PermitRootLogin yes
‘#’ 기호가 들어가면 주석이 붙어 해당 라인이 적용되지 않는 것이지만, sshd_config에서는 해당 라인이 없을 경우 yes가 기본값으로 처리되기 때문에 주석을 해제하고 root 로그인 설정을 차단해야 합니다.
- yes
- root 로그인을 허용합니다. 보안상 권장되지 않습니다.
- no
- root 로그인을 차단합니다.
- without-password (최신 openssh에서 prohibit-password로 변경됨)
- OpenSSH 7.0 이상 버전부터 사용 가능하며 without-password 또는 prohibit-password로 지정되면 원격지에서 root 로그인으로 패스워드가 아닌 공개 키 인증으로만 접속이 가능합니다.
여기서 주석을 해제하고 no 로 값을 변경하여 root 로그인을 차단하겠습니다.
PermitRootLogin no
다음으로 아래 내용들이 각각 주석 처리되었음을 확인할 수 있습니다. 보이는대로 2m, 6, 10은 기본 값으로 지정되어있는 값들입니다.
#LoginGraceTime 2m #MaxAuthTries 6 #MaxSessions 10
- LoginGraceTime
- 로그인 시도 시 사용자 인증을 요청받을 수 있는 최대 시간이며 인증 도중 이 시간이 초과되면 연결이 끊깁니다. 3m이라면 연결 후 3분 내로 인증을 완료해야 합니다.
- MaxAuthTries
- 계정 당 최대 연결 시도 횟수입니다. 6인 경우 6번 인증 실패 초과 시 연결이 끊깁니다.
- MaxSessions
- SSH 연결을 허용할 최대 클라이언트 수입니다. 10인 경우 10개의 동시 연결이 가능합니다.
주석을 해제하고 이 값들을 적절히 조정하여 로그인 시의 보안성을 강화할 수 있습니다.
이제 모든 설정이 완료되었습니다. SSHD 서비스를 시작하여 다른 PC에서 접속할 수 있도록 해보겠습니다.
[root@localhost ~]# service sshd start (또는 systemctl start sshd)
만약 위 명령어로 서비스가 인식되지 않는 경우 sshd 대신 ssh 로 입력하여 시도해보세요. (service ssh start)
다음 명령어로 현재 ssh 서버가 구동 중인지 확인해볼 수 있습니다. ssh 서버의 프로세스 이름은 sshd(SSH Daemon)와 같이 표기됩니다.
ps 명령어 이용
결과가 나타난다면 서비스가 구동 중입니다.
[root@localhost ~]# ps -aef | grep sshd root 5255 1 1 17:54 ? 00:00:00 /usr/sbin/sshd -D
service 명령어 이용
Active: active로 나타난다면 서비스가 구동 중입니다.
[root@localhost ~]# service sshd status Redirecting to /bin/systemctl status sshd.service ● sshd.service - OpenSSH server daemon Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled) Active: active (running) since 토 2018-08-18 17:54:34 KST; 4min 5s ago Docs: man:sshd(8) man:sshd_config(5) Main PID: 5255 (sshd) Tasks: 1 CGroup: /system.slice/sshd.service └─5255 /usr/sbin/sshd -D 8월 18 17:54:34 localhost.localdomain systemd[1]: Starting OpenSSH server d... 8월 18 17:54:34 localhost.localdomain sshd[5255]: Server listening on 0.0.0... 8월 18 17:54:34 localhost.localdomain sshd[5255]: Server listening on :: po... 8월 18 17:54:34 localhost.localdomain systemd[1]: Started OpenSSH server da... Hint: Some lines were ellipsized, use -l to show in full.
systemctl 명령어 이용
Active: active로 나타난다면 서비스가 구동 중입니다.
[root@localhost ~]# systemctl status sshd ● sshd.service - OpenSSH server daemon Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled) Active: active (running) since 토 2018-08-18 17:54:34 KST; 4min 31s ago Docs: man:sshd(8) man:sshd_config(5) Main PID: 5255 (sshd) Tasks: 1 CGroup: /system.slice/sshd.service └─5255 /usr/sbin/sshd -D 8월 18 17:54:34 localhost.localdomain systemd[1]: Starting OpenSSH server d... 8월 18 17:54:34 localhost.localdomain sshd[5255]: Server listening on 0.0.0... 8월 18 17:54:34 localhost.localdomain sshd[5255]: Server listening on :: po... 8월 18 17:54:34 localhost.localdomain systemd[1]: Started OpenSSH server da... Hint: Some lines were ellipsized, use -l to show in full.
SSH 접속 – 접속 전 준비 사항
호스트 주소(IP 또는 도메인)와 사용자 정보(Credential)가 있으면 접속이 가능합니다. 각각의 SSH 클라이언트 프로그램 마다 접속 방법이 다를 수 있습니다.
먼저 호스트 주소는 ifconfig
또는 ip addr
명령어로 확인이 가능합니다. (리눅스에선 윈도우와 달리 ipconfig가 아닌 ifconfig를 사용합니다!)
ifconfig 명령어를 찾을 수 없는 경우 다음 패키지를 설치해주셔야 합니다.
[root@localhost ~]# yum install net-tools (또는 apt install net-tools)
결과는 아래와 같이 표시될 것입니다. 여기에서 ens33 또는 eth0 항목의 값을 참고해주시면 됩니다.
SSH Client 설치
SSH 프로토콜을 사용하여 원격 호스트에 접속하려면 접속 가능한 클라이언트 프로그램(SSH Client)이 필요합니다.
리눅스나 macOS운영체제의 경우 SSH Client인 OpenSSH가 기본으로 탑재되어 있어 터미널 응용프로그램을 열어 명령어를 입력하면 바로 접속이 가능합니다.
터미널에서 ssh [UserName]@[HostName]
을 입력하여 연결이 가능합니다. 사용자 이름이 user이고 호스트 주소가 192.168.1.123인 경우 아래와 같이 입력합니다.
ssh [email protected]
그러나 윈도우 운영체제를 사용 중이라면 OpenSSH 클라이언트가 따로 없기 때문에 OpenSSH를 이용한 외부 터미널 클라이언트를 설치해야 합니다. (물론 Linux나 macOS 버전의 외부 클라이언트 프로그램도 존재합니다.)
대표적으로 PuTTY나 Xshell, SecureCRT, TeraTerm 그리고 MobaXterm 등이 있습니다. 다양한 클라이언트가 있으며 해당 프로그램 마다의 특장점들이 있습니다. 그 중 PuTTY와 Xshell에서 SSH 연결 방법에 대해서만 기술합니다. 대부분의 클라이언트에서의 접속 방법은 비슷하기 때문에 아래를 참고하여 진행해도 됩니다.
SSH 클라이언트에서 접속 – Xshell
접속 호스트는 192.168.1.123
, 접속 계정은 user, 패스워드는 passwd로 가정하여 진행해보겠습니다.
Xshell을 실행한 후 새로운 세션을 생성합니다. (파일 – 새로 만들기)
새 세션 등록 정보 창이 열리면 세션 파일의 이름과 호스트 정보를 입력하고 프로토콜을 SSH로 선택한 후 연결을 클릭합니다.
호스트 키 검증 창이 뜰 것입니다. 수락 및 저장을 클릭하여 현재 PC에 서버 PC의 호스트 키를 저장하여 추후 동일 서버 여부를 체크하도록 합니다.
SSH 사용자 이름 창이 나타나면 사용자 계정 이름을 입력하고 확인을 클릭합니다.
SSH 사용자 인증 창이 나타나면 인증 방법을 Password로 선택한 후 암호를 입력한 후에 확인을 클릭하여 인증을 완료합니다.
Connection established. 문구로 원격 터미널 접속에 성공한 것을 확인합니다.
SSH 클라이언트에서 접속 – PuTTY
접속 호스트는 192.168.1.123
, 접속 계정은 user, 패스워드는 passwd로 가정하여 진행해보겠습니다.
PuTTY를 실행한 후 호스트 정보를 입력하고 Connection Type를 SSH로 선택한 후 Open을 클릭합니다.
호스트 키 검증 창이 뜰 것입니다. 예를 클릭하여 현재 PC에 서버 PC의 호스트 키를 저장하여 추후 동일 서버 여부를 체크하도록 합니다.
사용자 이름과 암호를 입력하면 원격 터미널 접속에 성공하게 됩니다.
ssh 다운을 하려하는데 자꾸 openssh-server is already the newest version 이떠요 업데이트도 다했는데
이미 SSH가 설치되어있어서 그렇습니다. (그리고 최신버전이기 때문에 더 이상 업데이트 할 필요가 없다고 하네요.)
대부분의 리눅스 배포판 설치 시 ssh 서버를 기본 제공하기도 하므로 설치가 되어있다면 건너뛰어도 좋습니다.
설치 확인 방법 : systemctl status sshd 또는 service sshd status 를 입력하여 service not found가 나타나지 않으면 설치된 상태입니다.
영어 해석좀 하고 댓달지;;
ㅋㅋ
ㅋㅋㅋㅋㅋ
ㅋㅋㅋㅋㅋㅋㅋ
리눅스 서버 구축에 대해 관심 있어서 찾아봤는데 설명 꼼꼼하게 잘 되어있네요!! 잘 참고하겠습니다!
공유기 사용 중이면 공유기에서도 포트포워딩 필요한가요
정보 감사합니다. 잘 읽었습니다!
잘 작동되네요. 감사합니다!