디지털 인증서(Digital Certifiate)

우리가 웹 사이트나 모바일 뱅킹 등의 서비스를 이용할 때 안전하게 사용할 수 있는 이유로는
TLS(Transport Layer Security) 방식으로 서버와 노드간 주고받는 내용을 암호화 처리하여
패킷을 가로채더라도 복호화를 해야만 볼 수 있게끔 만들어주는 기술이 적용되기 때문이다.

웹 서버는 클라이언트와 서버의 보안접속을 위해서
대중적으로 많이 사용되는 웹 브라우저(Chrome, Firefox, Whale, MS Edge, Opera ..)에
자신들의 인증서(.crt = Public Key)웹 브라우저에 배포해 보안접속을 가능하게 해준다.

실제로 서비스에 사용되는 인증서의 경우는 금액을 지불하고 인증기관(CA)에 요청하여
CA에게 서명을 받은 인증서를 발급받게 되는데, 이런 공인된 인증서를 발급해주는 회사로는
COMODO, VeriSign, DigiCert ... 등의 대표적인 기업이 존재한다.

공인된 인증서의 경우 금액과 복잡성의 리스크가 존재하므로,
이번 실습에서는 로컬 및 집단의 내부에서만 사용되는 인증서 생성 및 배포를 실시

▶ 공인된 인증서의 발급 과정

1. 인증서 발급을 위한 개인 키(Private Key)를 생성

2. 인증서 발급 요청서(*.csr)을 개인 키와 공개 키를 이용하여 생성
(공개 키를 포함한 인증서(*.crt) 생성을 위해서 개인 키로 인증을 실시한다)

3. 생성된 인증서 발급 요청서를 이용하여 인증 기관(CA)에 인증서 인증을 요청

4. 검토 절차가 종료된 후 FingerPrintDigita Signing을 인증서에 등록하여 발부



물론 로컬에서 웹 서비스등의 서비스 테스트를 위한 사설 인증서 발급의 경우에는
위의 절차 보다는 편리하게 사설 인증서로 직접 인증서를 생성하여 사용할 수도 있다.

* 실습환경 : Intel i7-1260P(AMD64)
** 네트워크 대역 : 192.168.100.0/24
*** 해당 실습에서 사용된 가상 머신 : CentOS 7(.140 = Web Server), Windows 7(.147 = Web Client)


▼ HTTP(평문장) 연결방식과 HTTPS(암호화) 전송 방식의 차이점 참고자료

 

[Security]HTTPS

HTTPS(Hyper Text Tranfer Protocol Secure) 네트워크 서비스(웹 사이트, 금융, 공인인증서 ...)를 안전하게 이용할 수 있게 해주는 역할을 하는 방식으로 대부분 네트워크 패킷 전송에 사용되는 TCP 프로토콜

for-security.tistory.com

 

● 개인 키와 서명 인증 요청서 생성

# openssl 패키지 다운로드 및 수동설치
sudo wget https://www.openssl.org/source/openssl-1.1.1t.tar.gz
sudo tar xvfz openssl-1.1.1t.tar.gz

# www.ditto.com의 개인 키 생성
sudo openssl genrsa -out www.ditto.com.key 2048		# 2048은 키의 복잡도를 의미

# 개인키의 보안을 위한 허가권 변경
sudo chmod 600 www.ditto.com.key

# 개인 키를 암호화 포맷으로 저장하는 방법
sudo openssl rsa -in www.ditto.com.key -des3 -out www.ditto.com.key.secure.key

openssl 개인 키 생성 및 허가권 변경

 

# sha256 암호화 알고리즘이 적용된 서명 인증 요청서를 생성
sudo openssl req -new -sha256 -key www.ditto.com.key -out www.ditto.com.csr

(좌)서명 인증 요청서 생성 / (우)서명 인증 요청서의 내용

위의 두 파일을 사용하여 공인 기관(CA)를 통한 기간제 무료 인증서 발급이 가능하며,
해당 기관의 인증을 받은 인증서는 실제 웹 서비스 호스팅 시 사용이 가능하다.

▼ 로컬 도메인에서만 사용 가능한 사설 인증서 발급과정

# 앞에서 생성한 개인 키로 자체적으로 인증서(*.crt)를 발급
# x509는 공개키 알고리즘의 표준(방식)
sudo openssl req -new -sha256 -x509 -nodes -days 365 -key www.ditto.com.key -out www.ditto.com.crt

# 인증서 발급 시 기재사항
# Country Name ~ Email Address까지 순서대로 국가, 도시, 지역(구), 조직이름, 부서명, 이메일을 의미함

You are about to be asked to enter information that will be incorporated into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter the field will be left blank.
---
Country Name (2 letter code) [XX]:KR	
State or Province Name (full name) []:Seoul	
Locality Name (eg, city) [Default City]:Mapo
Organization Name (eg, company) [Default Company Ltd]: Company
Organizational Unit Name (eg, section) []:Security
Common Name (eg, your name or your server's hostname) []:www.ditto.com
Email Address J:admin@ditto.com	

# 생성된 인증서의 내용을 확인
sudo openssl ×509 -noout -text -in www.ditto.com.crt

(좌)자체 인증서 발급 / (우)인증서의 내용 확인

 

# 보안을 위해 허가권과 저장 경로를 변경
sudo cp -arp www.ditto.* /etc/pki/tls/private
sudo chmod 600 -R /etc/pki/tls/private/*

생성된 키, 서명 요청서, 인증서

 

# mod_ssl 패키지 다운로드
sudo yum install -y mod_ssl

# Apache 구성파일 중, /etc/httpd/conf.d/ssl_conf 파일 수정
sudo vim /etc/httpd/conf.d/ssl_conf

[파일 내용]
95 # Server Certificate:
96 # Point SSLCertificateFile at a PEM encoded certificate. If
97 # the certificate is encrypted, then you will be prompted for a
98 # pass phrase. Note that a kill -HUP will prompt again. A new
99 # certificate can be generated using the genkey (1) command.
100 SSLCertificateFile/etc/pki/tls/private/www.ditto.com.crt		# 인증서 경로
101
102 #Server Private Key:
103 #If the key is not combined with the certificate, use this
104 #directive to point at the key file. Keep in mind that if
105 #you've both a RSA and a DSA private key you can configure
106 #both in parallel (to also allow the use of DSA ciphers, etc.)
107 SSLCertificateKeyFile/etc/pki/tls/private/www.ditto.com.key		# 개인 키 경로

Apache 서비스, ssl_conf 파일

 

sudo vim /etc/pki/tls/openssl.cnf

서버 내에 웹 서비스 뿐이 아닌 다른 서비스가 존재한다면,
해당 프로토콜을 지원하는 인증서를 함께 발급하여 인증서를 유효화할 수 있다.

# 클라이언트에서 접속할 수 있도록 방화벽 개방
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload 

# 포트 개방상태를 확인
sudo netstat -nltp | grep LISTEN
tcp		0 	0 0.0.0.0:80		0.0.0.0:* 		LISTEN		80/httpd
tcp		0 	0 0.0.0.0:80		0.0.0.0:* 		LISTEN		443/httpd

# 간단한 웹 페이지를 생성
[centos@localhost ~]$ su -c "echo \"<h1>This is Ditto's Web For test Certificates</h1>\" > /var/www/html/index.html"
[centos@localhost ~]$ cat /var/www/html/index.html
<h1>This is Ditto's Web For test Certifiacate</h1>

# httpd 서비스 재시작 후 상태확인
sudo systemctl restart httpd
sudo systemctl status httpd

 

 

httpd 서비스 재시작 시 발생할 수 있는 경고문

오류 메시지의 내용을 읽어보면, 해당 컨텐츠의 내용을 사용자가 읽기 가능하게 하려면
'httpd_user_read_user_content'의 SEboolean 값을 1(참)로 변경하라는 것을 확인할 수 있다.
SELinux 의 Status를 Permissive(0)으로 만들어 해결도 가능하지만 보안상 취약하므로 선호되지 않는다.
(아래에 표기되어 있는 방식대로 SELinux의 보안 레벨을 수정 후 재시작하면 해결)

▼ Web Client Windows 7(.147) 에서의 작업

C:\Windows\System32\drivers\etc\hosts 파일

관리자 권한으로 메모장을 실행한 뒤 해당 경로의 hosts 파일에
CentOS 7의 웹 서버 FQDN을 정의해준다.

CentOS의 사설 인증서를 윈도우 PC로 복사

본래 인증서는 USB나 SMB .. 등의 수단으로 인증서를 옮기지만,
실습 편의를 위해 드래그 앤 드롭 형태로 인증서를 복사하였다.
더블 클릭하여 인증서 등록 과정을 진행한다.

 

외부 인증서를 윈도우 PC에 설치하는 과정

로컬에서 CA의 공식 인증이 아닌 자체적으로 제작된 인증서인 관계로
위의 그림과 같은 경고문을 확인할 수 있는데, 출력된 내용대로
'루트 인증 기관 저장소'에 설치해야 인증서로서의 기능이 적용된다.
(해당 인증서는 Google Chrome에서 사용이 불가했다)

 

(좌)등로된&nbsp; 후의 인증서 / (우)인증서의 정보를 확인

인증서 내용 확인 시, CentOS에서 생성 시 기입했던 내용의 정보와 일치하는 것을 확인할 수 있다.

 

https://www.ditto.com

https 프로토콜로 접속 시 서버와의 연결이 암호화 되었다는 안내문구를 확인할 수 있음

'System_Security' 카테고리의 다른 글

[Security]TrueCrypt  (0) 2023.02.02
[Security]SSH_Keygen  (0) 2023.02.01
[Security]HTTPS  (0) 2023.01.31
[Security]chroot  (0) 2023.01.27
[Security]Snort  (0) 2023.01.26

TrueCrypt(볼륨 암호화 도구)

노출되면 안되는 파일, 기밀유지가 필요한 문서 및 인증서 등을 안전하게 보관하기 위해
키(Key) 혹은 비밀번호(PassPhrase)로 인증 후 마운트하여 사용할 수 있게끔 가상의 볼륨파일을 생성해주는 도구이다.
* 이와 유사한 기술로는 대표적으로 Windows의 BitLocker가 존재
** 디스크 자체를 암호화 하는 것도 가능하다.


여기서 가상의 볼륨파일이란 TrueCrypt 혹은 해당 프로그램과 연관성 있는 도구(Tool)들로 암호화된 볼륨파일을
복호화 하여 사용할 수 있게끔 생성되는 파일형식으로, 설령 파일이 노출되었다고 하더라도
암호화 되어있기 때문에 쉽게 크랙하기 어렵다고 한다.

TrueCrypt는 오픈 소프트웨어로 누구나 간편하게 본인의 중요한 문서들을
암호화된 가상의 볼륨 파일로 저장하여 소유할 수 있다.

* 네트워크 대역 : 10.211.55.0/24
** 실습환경 : M1 Based Mac(ARM64)
*** 해당 실습에서 사용된 가상 머신 : Kali2022(.111), Ubunser20.04(.50)

● TrueCrypt 실습

# Ubunser에서 TrueCrypt 설치를 위한 레포지토리 추가
sudo add-apt-repository ppa:stefansundin/truecrypt
sudo apt update -y && sudo apt install -y truecrypt

 

sudo truecrypt

TrueCrypt를 실행했을 때의 모습, 좌측 하단의 Create Volume 버튼을 눌러 가상 볼륨 파일을 생성한다.

TrueCrypt

좌 : 이번 실습의 목적은 가상의 저장장치 파일을 만드는 것이므로 상단 옵션에 체크된 상태로 Next를 클릭
* 하단 옵션의 경우 물리적인 디스크 자체를 암호화 하는 방식

우 : 상단의 Standard TrueCrypt volume을 선택하여 넘어간다.
* 하단 옵션의 경우 중첩으로 암호화하는 옵션으로 가상 볼륨파일1 안에 가상볼륨2 를 생성하는 옵션

TrueCrypt

좌 : 'Select File...'을 클릭하여 암호화된 가상 볼륨 파일을 저장할 위치를 지정
* 'Encrypt' 라는 이름으로 저장

우 : 윗 부분의 경우는 암호화 알고리즘, 아랫 부분의 경우는 해쉬 알고리즘을 지정할 수 있다.
* 실습에서는 기본 값인 AES와 RIPEMD-160 방식으로 진행해주었다

TrueCrypt

좌 : 생성할 볼륨 파일의 용량을 지정한다.
* 지정한 만큼의 용량이 디스크에 실질적인 파일의 용량이 되므로 이에 유의

우 : 표기된 부분을 확장하여 몇 가지 파일 시스템 선택이 가능하다.
* FAT, NTFS, ext2..3...4 .. 등

TrueCrypt

좌 : 복호화 시 사용할 패스워드를 입력해주며, KeyFile로도 암호화가 가능한 것을 확인할 수 있다.
* 실습의 이해를 위해 쉬운번호를 입력, 실제로는 .. 당연히 권장되지 않음(파일 암호화의 의미가 없음)

우 : 암호화를 진행한다.
* IRQ(Inturrupt ReQuest)를 이용하여 암호화 속도를 향상시킬 수 있음

TureCrypt

앞에서 지정한 경로인 '/home/ubunser/crypted' 경로에 'Encrypt'라는
가상의 암호화 볼륨파일이 생성되었음을 확인

TreuCrypt

콘솔창에서 'sudo truecrypt' 를 입력해 소프트웨어를 실행시켜 마운트를 진행한다.

좌 : Select File 버튼을 눌러 가상 볼륨 파일을 로컬의 11번 디스크에 마운트
* 마운트 디스크 선택 시 사용되지 않는 디스크를 선택해주면 된다(필자는 11번 디스크)
** 운영체제마다, 현재 사용중인 디스크의 갯수에 따라 다르게 표기될 수 있음

우 : 마운트 포인트와 해당 가상 볼륨의 FreeSpace를 확인할 수 있다.
* 마운트 포인트는 df 명령어를 이용하여 확인할 수도 있음

▼ 임의의 파일을 암호화된 가상 볼륨에 생성

# 임의의 비어있는 파일들을 생성
sudo touch /media/truecrypt11/Encrypt{1,2,3,4,5}

# 텍스트 파일의 정상적인 복호화 확인을 위해 텍스트 파일 생성
sudo vim Secret_File

# 텍스트 파일의 내용
This is Secret File

# 파일 생성 작업을 완료한 후 umount 커맨드 OR TrueCrypt GUI에서 마운트를 해제한다.
sudo umount /media/truecrypt11

 

생성된 파일들을 확인

 

sudo scp crypted/Encrypt kali@10.211.55.111:/home/kali

 


복호화를 수행할 원격지로 볼륨 파일을 복사해준다.

▼ 복호화 수행

# ARM 기반 Kali의 경우 TrueCrypt 소프트웨어 지원이 불가하여 zuluCrypt-gui로 대체하여 실습을 진행함
sudo apt install -y zuluCrypt-gui  

# zuluCrypt-gui 실행
sudo zuluCrypt-gui

 

zuluCrypt

scp로 넘겨받은 볼륨 파일을 확인, 파일의 크기도 동일한 것을 확인할 수 있다.

 

zuluCrypt

좌 : Open → Volume Hosted In A File 진입하여 복호화 및 열람할 볼륨 파일을 지정

우 : Volume Type 지정 시 TrueCrypt에서 만들어진 파일이므로 위와 같이 선택 후,
TrueCrypt로 볼륨 생성 시 입력했던 패스워드와 동일한 패스워드를 입력해준다.
* 읽기 전용으로도 마운트 가능

 

zuluCrypt

패스워드 인증이 성공하면 TrueCrypt와 유사하게 마운트 포인트를 확인할 수 있다.
Free Space에 대한 표기가 되어있지 않지만 df 명령어를 이용하여 확인이 가능하다.
* 패스워드 인증 성공 후 알림창이 나오면 Cancel로 닫아준다.

 

zuluCrypt

위 그림처럼 정상적으로 복호화 하여 암호화된 볼륨 안에 있는 파일들이 동일하게 존재하는 것을 확인할 수 있다.

'System_Security' 카테고리의 다른 글

[Security]Digital_Certificate  (0) 2023.02.12
[Security]SSH_Keygen  (0) 2023.02.01
[Security]HTTPS  (0) 2023.01.31
[Security]chroot  (0) 2023.01.27
[Security]Snort  (0) 2023.01.26

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

chroot(change root)

chroot는 '어느 지정된 디렉토리'를 루트(/) 디렉토리로 만들어주는 명령어로,

서버 시스템에 FTP, NFS .. 등의 서비스를 설정한 뒤 클라이언트들이 외부로 공개되어 있는

FTP 서버의 오픈 디렉토리로 접속하여 cd, ls 등의 커맨드를 사용하여 오픈된 디렉토리의

상위 디렉토리로 이동 및 탐색하는 것을 방지하기 위해 사용하는 중요한 설정이다.

 

요악하면 '어느 지정된 디렉토리'를 가상의 최상위(/) 디렉토리로 만들어서

원격지 시스템의 다른 경로로 유입 및 탐색을 방지해주는 역할을 하는 보안 설정이다.

 

* 해당 실습에서 사용된 네트워크 대역 : 192.168.100.0/24

** 해당 실습에서 사용된 가상 머신 : CentOS(.150), Ubuntu(.130)

*** 실습 편의를 위해 FTP 접속을 위한 유저 및 그룹을 새롭게 생성하여 진행 하였음

 

● 임의로 생성한 ftp 디렉토리 chroot 설정

sftp [FTP ServerUser]@[FTP Server IP]

 

sftp> [command]

 

sftp [FTP Server User]@[FTP Server IP OR Domain_name]
# FTP 서버로의 원격 접속을 요청
# SFTP는 FTP와는 다르게 SSH(TLS/SSL)와 동일한 방식의 인증절차를 거치게 된다.

--- FTP 접속 후 ---
pwd, ls, cd ...
# 해당하는 명령어들을 활용하여 원격지의 공유 디렉토리 뿐만 아니라
# 그 외의 디렉토리에 대한 탐색, pull, get이 가능한 부분을 확인할 수 있다.

--- 원격지에 접속한 상태 ---
!ls, !pwd, !mkdir ...
# 일반적으로 사용되는 명령어 앞에 '!'을 추가하여 사용 시
# 원격지가 아닌 나(Local) 시스템에 대한 명령어를 수행할 수 있다.

 

useradd [UserName] -d /ftp -s /sbin/nologin -> passwd [UserName]

FTP 서버 접속을 위한 새로운 사용자 'tester'의 홈 디렉토리(/ftp)로그인 쉘(/sbin/nologin) 설정을 지정하여 유저를 새롭게 생성

 

 

새로운 그룹 생성 및 유저를 해당 그룹에 추가

groupadd [GroupName]
usermod -G [GroupName] -a [UserName]
# 새로운 그룹을 추가한 뒤 새롭게 생성된 사용자를 해당 그룹에 추가한다.

groups [UserName]
# 해당 사용자가 소속되어 있는 그룹을 확인할 수 있는 명령어

 

 

cp -arp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

[/etc/ssh/sshd_config]
131 # override default of no subsystems
132 # Subsystem	sftp /usr/libexec/openssh/sftp-server <- 기존설정 주석처리
133 Subsystem	sftp internal-sftp
134 Match Group	[GroupName]
135 ChrootDirectory /secure/%u
136 ForceCommand internal-sftp

# [GroupName]에 소속 되어있는 [UserName] 사용자가 sftp로 접속했을 때
# /secure 디렉토리가 최상위(/) 디렉토리가 되어 상위 디렉토리로 이동을 불가하게 설정해줌

mkdir -p /secure/[UserName]/ftp
chown [UserName]:[GroupName]
ls -l /secure/[UserName]/ftp
# FTP 작업을 진행할 디렉토리를 새롭게 생성해준 뒤, 일반유저 작업이 가능하게끔 소유권을 수정
# 마지막으로 해당 디렉토리의 설정 값을 보기 위해 ls -l 명령어로 확인

systemctl restart sshd OR systemctl restart ssh
# 새롭게 설정된 파일들의 적용을 위해 서비스 재시작

** sshd_config 파일 수정을 위해 기본 설정 값이 저장되어 있는 파일은 사전에 백업

sftp [FTP ServerUser]@[FTP Server IP]

FTP 서버에 접속하여 'cd / && ls' 명령어를 실행했을 때, 

chroot 설정이 안된 상태와는 달리 '/secure' 디렉토리가 최상위 디렉토리로 설정되어

일반적으로 '/' 디렉토리에서 볼 수 있는 파일들이 보이지 않는 것을 확인

 

'/ftp' 상위의 '/secure' 디렉토리에 새로운 파일 및 디렉토리 생성을 실행하여도

'Permission Denied'가 발생되는 것을 볼 수 있다.

 

다시 '/ftp' 디렉토리로 진입하여 디렉토리 생성을 완료한 후

 

 

cd /secure/tester/ftp

FTP 서버 로컬에 접속하여 해당 디렉토리 확인 시 문제없이 파일이 생성되어 있는 것을 확인할 수 있다.

'System_Security' 카테고리의 다른 글

[Security]Digital_Certificate  (0) 2023.02.12
[Security]TrueCrypt  (0) 2023.02.02
[Security]SSH_Keygen  (0) 2023.02.01
[Security]HTTPS  (0) 2023.01.31
[Security]Snort  (0) 2023.01.26

Snort(Network Intrusion Prevention / Detection System)

Snort는 침입감지를 수행하는 IDS의 역할을 주로하지만, IPS의 역할을 동시에 수행하여

외부로부터의 침입여부를 빠르게 알려준다.

 

Snort는 Sniffer mode, Logger mode, IDS/IPS mode 세 가지 모드로 작동될 수 있는데,

Snort가 제대로 작동되려면 AV에서의 악성코드에 대한 데이터베이스가 있어야 하듯이

유효한 침투에 대한 rule set가 필요한데, 이러한 정보들은 /etc/snort/rules에 저장 및 새롭게 생성이 가능하다.

 

- 스니퍼 모드(Sniffer Mode) : 네트워크 패킷을 읽고 콘솔에 출력

- 패킷 로거 모드(Packet Logger Mode) : 패킷을 디스크에 기록

- 침입 탐지 모드(Intrusion Detection) : 네트워크 트래픽 모니터링, rule.conf를 참조하여 violation 판단 및 동작 수행

 

* VMWare 네트워크 : 192.168.100.0/24

** 사용된 가상 호스트 : Ubuntu(.130), BackTrack(.135), metasploitable(.136)

 

해당 실습은 snort 패키지가 사전에 설치되어 있는 BackTrack 머신에서 진행하였음

패키지 설치 시 apt, yum(epel-release) 패키지 관리자로 snort 다운로드 가능

 

 

● Sniffer Mode 실습

root@bt:~# ifconfig eth0 promisc
# eth0 네트워크 카드를 PROMISC 모드로 전환

root@bt:~# ifconfig
# 변경사항 확인

 

Promiscuous Mode(eth0)

BackTrack(.135) 머신은 모니터링을 담당할 머신이기에

모든 패킷을 수신 가능하게 만들어주는 PROMISC 모드로 전환

 

 

cp -arp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
# 해당 명령어로 recommended 구성파일을 .conf 파일로 복사해준다.

 

vim /etc/snort/snort.conf

해당 첨부 사진에는 표기되지 않았지만, 53번째 줄을 주석처리 한 후,

54번째 줄에 "var EXTERNAL NET !$HOME_NET(192.168.100.0/24가 아닌 네트워크를 의미)"를 추가한다.

이번 실습에서는 실질적으로 사용되지 않는 설정 내용이지만, 추후 외부(External) 네트워크와의 실습 진행 시 필요한 부분이다.

 

 

vim /etc/snort/snort.conf

해당 설정파일의 하단부분을 확인해보면 참조 될 *.rules 파일이 지정 되어 있는 것을 볼 수 있다. 

줄을 한 칸 추가하여 "include $RULE_PATH/ssh.rules" 를 추가해준다.

 

 

vim /etc/snort/rules/ssh.rules

 

alert tcp any any -> $HOME_NET 22 (msg:"SSH Login Detected"; sid:000001;)

# snort.conf에 추가해준 새로운 *.rules을 생성하는 과정이다.
# any(0.0.0.0) any(0.0.0.0)에서 SSH를 요청하는 트래픽 발생 시 "SSH Login Detected"라는 
# 경고문을 출력해주는 역할의 구문이다.

 

/etc/init.d/snort restart

해당 명령어로 snort를 재시작 시켜준다.

 

snort -q -A console -i eth0 -c /etc/snort/snort.conf

• -q : 패킷을  잡아냄

• -A : 경고를 콘솔로 출력해냄

• -i : 인터페이스를 지정

• -c : 적용시킬 롤 파일

 

첨부사진과 내용은 다르지만, snort 설정을 완료한 후, 다른 가상 머신에서 ubuntu(.130)머신으로 ssh 연결 요청 시

위의 명령어로 모니터링을 시작하게 되면 아래의 사진과 동일한 형식으로

Source[n] -> Destination[22] 간의 패킷을 출력해주는 것을 확인할 수 있다.

위의 사진은 ICMP 룰을 설정한 후 해당 패킷이 감지됐을 때 출력해주는 알림(Alert)

 

 

● snort로 nmap을 이용한 포트스캔 감지

nmap -v -A 192.168.100.130

metasploitable(.136) 머신에서 ubuntu(.130) 머신을 타겟으로 포트스캔을 시도

 

 

snort -q -A console -i eth0 -c /etc/snort/snort.conf

이 외에도 다양한 룰을 추가 및 활성화하여 침입감지가 가능하며,

추후에는 snort를 이용한 침입감지 후 조치를 알아보도록 하겠다.

'System_Security' 카테고리의 다른 글

[Security]Digital_Certificate  (0) 2023.02.12
[Security]TrueCrypt  (0) 2023.02.02
[Security]SSH_Keygen  (0) 2023.02.01
[Security]HTTPS  (0) 2023.01.31
[Security]chroot  (0) 2023.01.27

+ Recent posts