활용하기

리눅스 SSH 접속 방법 (SSH 프로토콜 연결 허용 설정하기)

리눅스 시스템에 접근하기 위한 방법은 직접 로컬 PC에서 터미널이나 그래픽 인터페이스 등을 활용하여 작업을 진행하는 것과, 원격지에서 호스트 접속을 위한 프토로콜을 사용한 연결이 있습니다. 리눅스 시스템에 원격으로 접속하기 위해 작업 방식에 따라 다양한 프로토콜을 사용해볼 수 있습니다. 예를 들어 그래픽 데스크톱 환경을 원격지에서 사용하기 위해서는 XRDP나 XDMCP, VNC 등의 프로토콜을 사용합니다.

터미널을 사용하기 위해서는 SSHTELNET 등을 사용하여 접속합니다. 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 user@192.168.1.123

그러나 윈도우 운영체제를 사용 중이라면 OpenSSH 클라이언트가 따로 없기 때문에 OpenSSH를 이용한 외부 터미널 클라이언트를 설치해야 합니다. (물론 Linux나 macOS 버전의 외부 클라이언트 프로그램도 존재합니다.)

대표적으로 PuTTYXshell, 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의 호스트 키를 저장하여 추후 동일 서버 여부를 체크하도록 합니다.

사용자 이름암호를 입력하면 원격 터미널 접속에 성공하게 됩니다.

JooTC

안녕하세요. 테크놀로지에 관심이 많은 블로거입니다.

View Comments

Recent Posts

[안드로이드] INSTALL_FAILED_INSUFFICIENT_STORAGE 해결

INSTALL_FAILED_INSUFFICIENT_STORAGE 문제 안드로이드 스튜디오에서 에뮬레이터를 실행하고 개발중인 애플리케이션을 실행하려 하면 로그 창에 아래와 같이 표시되면서…

5개월 ago

Zalgo 텍스트와 이를 방지하는 방법

인터넷 커뮤니티 사이트에서 게시글이나 댓글에 간혹 장난을 목적으로 작성된 특이한 글자를 볼 수 있습니다. 위…

7개월 ago

리눅스 kill, killall 명령어 – 특정 프로세스 종료하기

리눅스 명령어 - kill, killall 리눅스 kill 명령어는 특정 프로세스를 종료해주는 명령어입니다. 백그라운드에서 실행되고 있는…

7개월 ago

JavaScript typeof null이 ‘object’인 이유

JavaScript는 역사가 긴 스크립트 프로그래밍 언어입니다. 세월이 흐르면서 많은 자바스크립트 표준이 만들어졌고, 현재는 많은 문법적…

7개월 ago

Mocha Error: Resolution method is overspecified. 해결 방법

NodeJS 테스트 프레임워크인 Mocha는 비동기 테스트를 지원합니다. 간혹 특정 테스트 스크립트를 작성하고 실행하면 아래와 같이…

7개월 ago

윈도우 11 설치 시 Microsoft 계정 로그인 없이 로컬 계정 만들기

언제부턴가 윈도우 11을 처음 설치할 때 마이크로소프트(Microsoft) 계정 로그인을 강제로 요구하게 되었습니다. 물론 마이크로소프트 계정이…

1년 ago