SSH-KeyPair(Private/Public)

SSH는 Telnet과 동일한 목적인 원격지(서버, 호스트 등)에 접속하여 시스템 제어를 하기위한 도구로,
기존 telnet, rlogin, rsh .. 등의 원격 접속 프로토콜들의 취약점을 보완하여 설계된 보안기능이 강화된 원격 접속 프로토콜로,
클라이언트와 서버가 주고받는 내용은 암호화되어 전송된다.

원격지 호스트의 크레덴셜(Credential)을 이용한 로그온이 기본적으로 가능하나
일반적인 비밀번호(Passphrase)보다 강화된 보안방식이 요구되거나, 특수목적(PSSH) 등의 이유로
SSH Key를 이용한 원격 접속 방식이 요구된다.

SSH Key는 대부분 강력한 암호화 알고리즘인 RSA 방식으로 생성하며
SSH-KeyPair 생성 시 Private(개인 키), Public Key(공개 키)가 한 쌍으로 동시에
'~/.ssh/' 경로 밑에 개인 키와 공개 키가 생성된다.
위와 같은 경로에 생성된다.
(파일 명 'rsa'=Encryption Algorithm)

클라이언트가 키 페어를 생성하여 서버의 .ssh/authorized_keys(Key Chain)에 등록하여
원격 접속 시 서버의 Key Chain에 저장된 Public Key와 클라이언트의 Private Key를 대조하여 인증받는 방식이 주로 사용된다.

이 키를 이용하여 원격지 호스트의 패스워드를 입력하지 않고 오직 키를 이용한 접속 설정 또한 가능하다.

* 해당 실습에는 Ubuntu(.130), CentOS(.140), Windows7(.147) 총 3대의 가상머신이 사용됨.
** Windows7 시스템에서는 키 생성과 원격접속의 편의성을 위하여 'putty', 'puttygen' 프로그램을 사용함

▼ Putty 다운로드 링크
https://www.puttygen.com/download-putty

● Keygen 실습

# CentOS(.140)에서 ssh 서비스와 방화벽 활성화
sudo yum install -y openssh-server
sudo systemctl enable sshd && sudo systemctl start sshd

# SSH(Port 22)방화벽 설정
sudo firewall-cmd --permanent --zone=public --add-service=ssh
sudo firewall-cmd --reload

# 위의 두 항목 설정완료 후 포트 개방 상태와 서비스 실행여부를 확인
sudo systemctl status sshd
sudo ss -nltp | grep ssh

서비스가 정상적으로 실행되는 상태

22번(SSH) 포트가 열려있는 상태


Windows7(.147)머신에서

키 생성 전 SSH로 원격접속

앞에서 다운 받아놓은 Putty를 실행하여
키가 생성되기 전 크레덴셜을 인증하는 방식으로 원격접속 가능 여부를 확인

puTTYgen 실행 시 출력되는 화면

Generate 버튼을 클릭하여 SSH-Key Pair 생성을 진행한다.

Key-gen 과정

진행 바 상단에 기재되어 있듯 공백에 마우스를 이리저리 움직이며
IRQ(Interrupt ReQeust)를 활용해 키 생성에 CPU가 적극적으로 사용될 수 있도록 해준다.
(속도향상)

Key-gen 과정

블러처리 된 부분의 전체문장을 복사하여 원격으로 접속하고자하는
서버에 복사하기 위해 임의의 텍스트 파일로 저장한 뒤,

중간 부분에 보이는 'Key passphrase'를 입력하여 키 체인을 이용한 인증 시
사용 될 패스워드를 설정해주는데, 이 부분을 비워두면 일체의 비밀번호 없이
오로지 키로만 인증되어 연결 요청(ssh ClientUser@ServerIP) 시
별도의 인증과정 없이 접속이 가능하게 된다.
* 본 실습에서는 키 패스워드를 사용하는 것으로 진행

마지막으로 우측 하단에 있는 'Save Private Key' 버튼을 클릭해
개인키를 저장해줄 위치를 지정해준다.

Windows7에서 원격지에 Key로 접속하기 위한 준비는 완료

▼ SSH Server 역할인 CentOS(.140)머신에 접속

vim /home/[User]/.ssh/authorized_keys

* Windows ↔︎ Linux간 공개 키 파일 이동 시 Putty를 활용한 scp, 혹은 SAMBA를 통해서 가능
** Linux ↔︎ Linux 간 공개 키 파일 이동 시 'ssh-copy-id ~' 커맨드를 통해 가능

[User]/.ssh 하위에 authorized_kyes 라는 파일을 생성하여 Windows7(.147)의 공개 키를
위의 그림과 같이 복사하여 붙여 넣어준다.

공개 키 인증 활성화

"vim /etc/ssh/sshd_conifg"
ssh 메인 설정파일을 열람 후 'PubKeyAuthentication yes' 부분의 주석 제거 후,
인증 시 참조될 'Authorized Key File(키 체인)'이 저장되어 있는 경로가 동일한지 확인

크레덴셜로 인증 비활성화

원격 접속 시 키 체인을 이용한 접속인지 쉽게 확인해볼 수 있도록
'PasswordAuthentication(비밀번호 인증)'을 비활성화

▼ 다시 Windows7 머신으로 돌아와서

ssh key 인증을 위해 Putty에 개인 키의 위치를 잡아줌

앞에서 생성한 Windows7(.140)의 개인키의 경로를 지정해준다.

ssh centos@192.168.100.140

동일하게 SSH 접속을 요청 시 개인 키 생성시에 입력했던 패스워드를 입력해주면,
키를 이용한 인증이 완료되어 정상적으로 SSH 서버머신에 접속한 모습을 볼 수 있다.

▼ Ubuntu(.130)의 Key 생성과정

ssh-keygen -t rsa

우분투에서는 putty가 아닌 ssh-client 패키지를 활용하여 키를 생성하였다.
"sudo apt isntall -y openssh-client" 명령어로 클라이언트 패키지를 설치 후
구성요소에 포함 되어있는 ssh-keygen 도구로 rsa 타입의 키를 생성해준다.
(이 때 PassPhrase를 별도로 사용하지 않는다면 명령어 뒷 부분에 -P "" 옵션을 추가)

ls /home/[User]/.ssh/

키 생성 후 해당 경로를 확인해보면 'id_rsa(개인 키)'와 'id_rsa.pub(공개 키)'가 생성된 것을 확인할 수 있다.
(rsa는 키 생성 시 사용한 암호화 알고리즘을 뜻함)

옆에 보이는 'known_hosts' 파일은 외부 머신들과 ssh 세션 연결 시 생성되는 파일이다.

생성된 공개키를 CentOS로 복사

ssh centos@192.168.100.140

여기에서도 마찬가지로 개인 키 생성 시 등록했던 패스워드로 개인 키 인증을 승인한다.
(원격지 호스트의 패스워드를 입력하는 것이 아니므로 혼동에 주의)

'System_Security' 카테고리의 다른 글

[Security]Digital_Certificate  (0) 2023.02.12
[Security]TrueCrypt  (0) 2023.02.02
[Security]HTTPS  (0) 2023.01.31
[Security]chroot  (0) 2023.01.27
[Security]Snort  (0) 2023.01.26

HTTPS(Hyper Text Tranfer Protocol Secure)

네트워크 서비스(웹 사이트, 금융, 공인인증서 ...)를 안전하게 이용할 수 있게 해주는 역할을 하는 방식으로
대부분 네트워크 패킷 전송에 사용되는 TCP 프로토콜에 많은 보안기법을 제공하여 데이터 송수신 시 보안을 향상시켜준다.

TLS(Transport Layer Security)와 SSL(Secure Socket Layer)가 가장 대표적으로 알려져있는데,
SSL의 취약점을 보완되어 보다 안정성이 좋은 버전이 TLS 이다.

평소에 누구나 웹 브라우저(Chrome, Firefox, Whale ...)를 사용한다면 쉽게 접해볼 수 있는 HTTPS와 HTTP의 차이점을 확인

* 해당 실습에서는 Fedora36(10.211.55.20)이 이용되었음


▼ 보안 인증서(*.crt)관련 참고자료

[Security]Digital_Certificate

디지털 인증서(Digital Certifiate) 우리가 웹 사이트나 모바일 뱅킹 등의 서비스를 이용할 때 안전하게 사용할 수 있는 이유로는 TLS(Transport Layer Security) 방식으로 서버와 노드간 주고받는 내용을 암

for-security.tistory.com


● HTTP와 HTTPS

# 웹 사이트 실습을 위한 준비

sudo dnf install -y httpd 
# 로컬 웹 사이트를 활성화하기 위한 httpd 패키지를 다운로드

echo "<h1>This is HTTPS Test Web Site</h1>" > /var/www/html/index.html
# 관리자 권한으로 간단하게 HTML 작성 후 해당 경로로 리다이렉트하여 웹 페이지 생성
# 에디터로 직접 수정해주어도 상관 X

sudo systemctl start firewalld
# 방화벽 설정을 위한 firewalld 서비스 시작

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firweall-cmd --reload
firewall-cmd --list-service
# 로컬 및 외부에서 Fedora(.20)머신의 웹 페이지 접근을 허용하기 위한 방화벽 설정

sudo systemctl restart httpd
# 설정사항 적용을 위하여 서비스를 재시작



먼저 "firefox http://www.google.com"을 일반 사용자의 콘솔창에 입력하여 Google 사이트로 접속

firefox http://www.google.com

일반 사용자 콘솔에서 해당 명령어로 Google 사이트에 접속하면 정상적으로 진입되는 것을 확인
TLS 방식을 사용한 접속이기에 빨간색 네모칸 안에 있는 자물쇠로 해당 사이트에 대한
인증서를 확인해볼 수 있다.

* 'http'로 입력을 요청했지만 접속 시 'https' 로 강제 리다이렉트 되는 것은 ssl.conf 등의 설정으로 인한 이유이다.
해당 내용에 대해서는 추후 기술

자물쇠 버튼 클릭 후 인증서에 대한 내용을 확인

Firefox의 Certificate Manager로 인증서의 정보를 자세히 확인

'Google' 사에서 불특정 다수 이용자의 원활한 접속을 위해서
Firefox 웹 브라우저에 ~.crt(인증서)를 생성하여 클라이언트의 웹 브라우저에 넣어 둔 것인데,
클라이언트와 서버는 대칭키 방식으로 통신 간 데이터를 암호화하고, 공개키로 복호화 한다.

이 방식은 SSH에서 개인 키(Private Key)와 공개 키(Public Key)로
클라이언트와 서버 간 인증을 해주는 원리와 비슷하다.

이번에는 앞에서 미리 만들어 둔 로컬(인증서가 없는) 웹 페이지에 대한 접속방식을 확인해본다.

# 로컬에서 생성한 웹 페이지를 IP가 아닌 FQDN으로 접속하기 위한 /etc/hosts 파일을 수정

sudo vim /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
10.211.55.20    www.myhomepage.com www # 해당 부분을 추가함

# Name Resolving 시 가장 먼저 로컬에 정의된 /etc/hosts 파일을 참조하기 때문에
# URL 검색 창에 "www.myhomepage.com" 입력 시 앞에서 생성한 웹 페이지로 접근한다.



▼ Name Resolve 관련 참고자료

[Linux]DNS

DNS(Domain Name System) 우리가 흔히 구글링을 하러 구글 웹 사이트에 접속할 때, 123.123.123.123 ... 식의 ip주소를 입력해 웹 사이트에 접근하는 경우는 거의 없다. 이렇듯 복잡한 ip주소 대신 사람이 이용

for-security.tistory.com




"firefox http://www.myhomepage.com"을 일반 사용자의 콘솔창에 입력하여 로컬 웹 페이지로 접속

HTTP로 로컬 웹 페이지에 접속한 모습

해당 그림에서도 볼 수 있듯이 인증서가 없는 HTTP(Plain Text) 웹 페이지로
자물쇠 아이콘에 빨간색 사선이 표시되어 웹 사이트에 대한 인증서 정보가 웹 브라우저에 없다는 것을 확인해볼 수 있다.


이어서 "firefox https://www.myhomepage.com" 을 일반 사용자 콘솔에서 입력하여 웹 페이지 요청을 시도

HTTPS 접속을 시도한 모습

웹 브라우저에 인증서가 저장 되어있지 않은 웹 사이트에 HTTPS 접속 요청 시
해당 그림처럼 연결 불가(Unable to Connect)라는 경고문을 확인해볼 수 있다.

* Firefox 및 그 외 브라우저의 버전별로 경고문의 출력내용이 상이할 수 있음

다른 버전의 Firefox에서 동일한 조건으로 웹 페이지 요청을 시도

해당 버전의 웹 브라우저에서는 인증서 정보가 없는 웹 페이지에 대한 HTTPS 접근 요청 시
보안 연결 실패(Secure Connection Failed)라는 경고문이 출력되는 것을 확인해볼 수 있다.



---> 다음 포스트에서는 디지털 인증서(Digital Certificate) 생성 및 사용에 대한 포스트 진행

'System_Security' 카테고리의 다른 글

[Security]Digital_Certificate  (0) 2023.02.12
[Security]TrueCrypt  (0) 2023.02.02
[Security]SSH_Keygen  (0) 2023.02.01
[Security]chroot  (0) 2023.01.27
[Security]Snort  (0) 2023.01.26

+ Recent posts