글을 쓰기 앞서 하기의 사이트를 참조하였습니다.

 

SSH 키 기반 인증이 뭔가요?

원격 컴퓨터에 접속 시 SSH 프로토콜을 사용하여 접속을 많이 시도합니다.

이때, 접속용 비밀번호 입력이 필요한데, 여기에 문제점이 아주 많다고 합니다..

 

[ SSH 비밀번호 인증방식의 문제점 ]

1. 매 접속 시 비밀번호를 입력해야 한다는 불편함이 있습니다.

2  비밀번호 입력 제한이 없어 브루트포스(무작위 대입)를 통해 비밀번호 인증을 시도할 수 있습니다. 

   2-1) fail2ban 과 같은 입력 횟수 제한 및 규칙을 설정할 수 있지만, 여전히 관리자를 괴롭게 합니다..

3. 여러 대의 서버 관리 중 하나의 서버의 비밀번호가 노출 및 탈취? 당하면 대부분의 서버들 또한 안전하지 못합니다..

...

이러한 문제점을 해소하는 방법으로 공개 키파일을 접속 대상 서버에 복사하여 사용할 수 있습니다.

(여기서 다루지 않은 키 구조에 대한 자세한 설명은 아래 설명을 참고하시길 바랍니다)

공개키 기반구조
비대칭키 알고리즘


이 방법을 사용하면 내 서버에서 원격 접속을 시도할 때 다음과 같은 과정을 수행합니다.

( 내 서버 : Client   ,   접속 대상 서버 :  Server )

더보기

1. Client 에서 Server 로 ssh 접속을 시도

2. Server 에서 공개 키를 통해 접속 정보를 암호화하여 Client 로 전송

3. Client 에서 본인이 소유한 비밀 키를 통해 Server 의 공개 키로 암호화된 접속 정보를 복호화 합니다.

4. Client 가 올바른 접속 정보를 확인하며, 정상적으로 Server 로 접속합니다.

 

위 과정은 초기 접속 시도할 때 비밀번호 입력이 필요하고, 이후 SSH 접속 시 자동적으로 수행되어 비밀번호 없이 접속이 가능합니다. 

ssh-copy-id 가 뭔가요?

위에서 언급했던 공개 키파일을 접속 대상 서버에 복사하는 명령어 입니다.

비밀번호 방식대신 키 기반 인증을 사용하는 방법을 보여드리겠습니다.

 

먼저 사용할 키쌍 (공개키-비밀키) 를 생성합니다.

$ ssh-keygen -t rsa -b 2048 

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): #키파일 경로 입력 (/root/.ssh/my_key)
Enter passphrase (empty for no passphrase): #비밀번호 입력
The key's randomart image is: #비밀번호 입력
+---[RSA 2048]----+
|      oo+*=.     |
|      .+++=.     |
|      .= =o.     |
|     .. +.*      |
|      .oS..*     |
|     ..=ooo.o.   |
|     .oo .o=o.   |
|      o .+E.+o   |
|       .oo=+. .  |
+----[SHA256]-----+

키를 생성했습니다.

이제부터 개인 키는 제한된 디렉토리에 보관되었습니다.   제한된 디렉토리 : /root/.ssh 

( SSH 클라이언트는 제한된 디렉토리에 보관되지 않은 개인 키를 인식하지 않습니다. ) 

 

키 생성 후 반드시 해야하는 작업이 있습니다, 바로 키 권한을 변경해주어야 합니다.

키 자체 권한을 600으로 바꾸어야, 시스템 외 다른 사용자가 스누핑할 수 없게 됩니다.

즉, 사용자 계정 또는 루트 계정에 대한 권한을 먼저 획득하여야 함을 의미합니다.

chmod 600 /root/.ssh/my_key

 이제 내 공개키를 접속 대상 서버에 복사를 합니다.

ssh-copy-id -i /root/.ssh/my_key USERNAME@REMOTE_HOST

접속 대상 서버의 호스트를 모르는 경우 수동으로 복사할 수 있습니다.

접속 대상 서버의 .ssh/authorized_key 파일에 공개 키파일의 내용을 추가만 하면 됩니다!!

 

이제 기존 비밀번호 인증 방식을 비활성화 해줍니다.

$ vi /etc/ssh/sshd_config

vim에서 /PasswordAuthentication 검색 
주석을 해제하고 no 값으로 설정한 후 vim 편집기에서 나옵니다.

$ systemctl restart sshd 

ssh 데몬을 재시작해주면 설정된 구성이 반영됩니다.

이제 비밀번호 없이 키 파일 기반으로 SSH 접속이 가능해졌습니다!!!!

여러 서버들을 사용중이라면 동일하게 구성하여 1대의 마스터 서버에서 쉽게 접속(제어)할 수 있습니다. 

 

 

위 과정을 동일하게 수행하면서 에러가 발생할 수 있습니다. 

아마도 사용자 계정과 루트 계정의 혼동으로 인한 문제일 수 있어 확인이 필요합니다.

 

혹여나, 공개 키를 삭제한 경우는 비밀 키로 기존과 동일한 공개 키를 생성할 수 있습니다.

더보기

ssh-keygen -f  (비밀 키 파일명) -y > (공개 키 파일명).pub

 

하지만, 위와 같이 공개 키를 복사하지 못하는 경우가 있을 수 있습니다.

그런 경우 비밀번호 방식을 사용하면서 추가적인 비밀번호 입력을 하지 않는 방법도 있습니다.

바로, ssh-agent 를 통해 메모리에 임시로 비밀번호를 캐시하는 방식입니다.

$ eval $(ssh-agent)
$ ssh-add /root/.ssh/my_key

ssh-agent 는 ssh 접속을 시도할 때 자동으로 수행할 스크립트를 지정하는 역할이라고 볼 수 있습니다.

 

'🐧Linux > 📟Shell' 카테고리의 다른 글

WSL2 ( set init process to systemd )  (0) 2022.12.11
exit code  (0) 2022.08.14

System has not been booted with systemd as init system (PID 1). Can't operate. Failed to connect to bus: Host is down

WSL 에서 systemctl 명령을 사용하면 위와 같은 에러가 발생하는데 init process (1번 프로세스) 가 systemd 로 시작되지 않았기 때문입니다.

 

systemd 명령을 사용하려면 아래와 같이 수행해야합니다. 

sudo apt-get update && sudo apt-get install -yqq daemonize dbus-user-session fontconfig
sudo daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
exec sudo nsenter -t $(pidof systemd) -a su - $LOGNAME

unshare 명령으로 pid 를 격리하여 1번 프로세스를 systemd 로 수행하는 데몬을 생성합니다.

'🐧Linux > 📟Shell' 카테고리의 다른 글

SSH 키 기반 인증? ssh-copy-id?  (0) 2022.12.17
exit code  (0) 2022.08.14

글을 쓰기 앞서 이곳을 참조하여 공부했습니다.

 

Q. exit code 가 뭔가요?

 

Linux에서 Command 를 입력하면 명령 실행 후 수행결과에 대해 리턴값입니다.

 

Q. exit code 가 왜 필요한가요?

 

파이썬과 같이 try ~ exept 예외처리문 처럼 리턴값에 따라 분기 처리를 하기 위해 필요합니다.

특정 shell script 는 작성하다보면 언제는 정상적으로 작동하지만 언제는 실패하는 경우가 있을 수 있습니다.

 

Q. exit code 값들은 무엇을 의미 하나요??

 

" echo $? " 마지막으로 수행된 명령의 리턴값을 확인할 수 있으며  리턴값은 0 ~ 255 까지 있습니다.
 (  0 을 제외한 나머지 값은 에러값을 의미합니다. )

 

     0 :         Success
     1 :         General Error   
     2 :         built-in shell command Error
     126 :     Command invoked cannot execute       (Command 가 존재하지만 실행 불가)
     127 :     "command not found"                            (Command 가 존재하지 않음)
     128 :     Invalid argument to exit                  
     128+n : Fatal error signal "n"                          
     130 :     Script terminated by Control-C         
     255+ :   Exit status out of range                   

 

exit code 의 종류

tldp.org
legendre13.log 

 

 

 

shell script 에서는  exit 명령에 인자값을 주어 특정 에러값을 반환할 수 있습니다.

#!/bin/bash

touch exit-code.txt

exit 23

> echo $? 
23

 

 

 

'🐧Linux > 📟Shell' 카테고리의 다른 글

SSH 키 기반 인증? ssh-copy-id?  (0) 2022.12.17
WSL2 ( set init process to systemd )  (0) 2022.12.11

+ Recent posts