본문 바로가기

[혁신성장 청년인재] 인공지능을 활용한 보안전문가 양성과정

Day9: 리눅스 관리자 | OpenSSH | NTP서버 | 방화벽 관리

0. 서버 hostname 설정하기

FQDN = hostname 서버이름 + domainname 도메인네임

ex. www.naver.com, mail.naver.com, cafe.naver.com

naver.com = 도메인 이름

www, mail, cafe 는 서버 이름

 

hostname의 분류 : static (고정), transient(일시적인), pretty(기호나 한글 사용가능한)

 

명령어

hostname : 호스트네임 확인

hostnamectl : 호스트네임 확인

hostnamectl set-hostname server.rich-developer.com  : 호스트 설정 static으로 

cat /etc/hostname 에 저장된다.

 

예제

//hostname 설정하기
[admin@localhost ~]$ hostnamectl set-hostname whynot_jung.com      

//hostname 확인
[admin@localhost ~]$ hostname   
whynot_jung.com

//hostname 확인
[admin@localhost ~]$ hostnamectl  
   Static hostname: whynot_jung.com
         Icon name: computer-vm
           Chassis: vm
        Machine ID: fafdaf9226ec4d439afa7b06f46dcdcb
           Boot ID: 0ab69508ca534476978af38584c9d609
    Virtualization: kvm
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-1127.el7.x86_64
      Architecture: x86-64
      
// /etc/hostname 파일 확인 --> 재부팅 시 적용됨
[admin@localhost ~]$ cat /etc/hostname
whynot_jung.com

// 바로 적용하려면 bash 쉘을 다시 실행해주기
[admin@localhost ~]$ /usr/bin/bash

//hostname 적용됨
[admin@whynot_jung ~]$ 

 

1. OpenSSH

SSH 프로토콜을 사용하여 원격접속할 수 있게 도와주는 서비스. 

텔넷(telnet)이나 리모트쉘(rsh)이 평문 전송으로 이루어지는 반면, SSH는 모든 데이터를 암호화해서 전송한다. 따라서 원격접속 시 더욱 안전하게 사용 가능하다. 

  1) ssh

    클라이언트에서 SSH를 사용하여 원격 접속을 할 때 ssh명령을 사용한다. 이후 패스워드를 입력해야 한다. 

ssh [user-name]@address
user-name은 접속하고자 하는 사용자 이름. 이를 생략하고 address만 입력하면 현재 로그인된 사용자와 동일하게 접속된다.
address에는 접속하려는 시스템의 DNS이름 또는 IP 주소

-X 옵션 사용시 그래픽 도구 사용 가능!

ex. admin@172.0.0.1

 ssh의 구성 파일

[admin@whynot_jung ~]$ ls /etc/ssh
moduli      sshd_config         ssh_host_ecdsa_key.pub  ssh_host_ed25519_key.pub  ssh_host_rsa_key.pub
ssh_config  ssh_host_ecdsa_key  ssh_host_ed25519_key    ssh_host_rsa_key
moduli Diffie-Hellman 알고리즘에 사용되는 파라미터 포함
ssh_config open ssh 클라이언트 설정에 필요한 파일
sshd_config open ssh 서버 설정에 필요한 파일
ssh_host_암호화알고리즘이름_key 해당 알고리즘의 개인 키
ssh_host_어쩌구~알고리즘이름_key.pub 해당 알고리즘의 공개키

  2) ssh-keygen

ssh 원격 접속시 아이디 패스워드로 접속해도 되지만, 키 기반 인증으로 접속하면 패드워드 매번 안써도 됨.

키를 직접 가지고 있어야 하기 때문에 아이디-패스워드처럼 유출? 될 염려가 적음

 

ssh-keygen 명령어로 생성 가능하다. 아래와 같다. 엔터 엔터 치면 금방 생성된다.

[hyeonjeong@localhost ~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hyeonjeong/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/hyeonjeong/.ssh/id_rsa.
Your public key has been saved in /home/hyeonjeong/.ssh/id_rsa.pub.
The key fingerprint is:
b1:62:b8:a5:c2:bb:8f:d4:c3:ff:06:eb:7e:16:55:19 hyeonjeong@localhost.localdomain
The key's randomart image is:
+--[ RSA 2048]----+
|            Eo   |
|            o    |
|        .  .     |
|     .   o.      |
|    . + S.       |
| . o =...        |
|  + *  o .       |
| . + o. +        |
|  +o.o+=.        |
+-----------------+
[hyeonjeong@localhost ~]$

읽어보면 알겠지만, public rsa key 와 private ras key 한 쌍을 생성한다. 이는 홈 디렉터리의 ./ssh 에 저장된다.

[hyeonjeong@localhost ~]$ ls .ssh
id_rsa  id_rsa.pub

passphrase 를 입력하라고 나오는데 이를 입력하면, key 인증 시 패스워드를 입력해야 한다. 그냥 엔터를 쳐서 넘겼다.

 

-t 옵션을 사용하면 암호화 알고리즘을 지정할 수 있다. 

ssh-keygen -t ecdsa

 

  3) 키 파일 중 공개키를 접속하고자 하는 시스템에 전달! 

사용자가 생성한 키 중 공개키를 접속하고자 하는 시스템에 전달해야 한다. 이 때 ssh-copy-id 명령을 사용한다. 

옵션을 주지 않을 경우 사용자의 홈 디렉터리의 .ssh 디렉토리에서 id_rsa.pub를 전달한다.

ssh-copy-id [user-name]@address

 

 

# 파일 보내기
[root@whynot_jung ~]# scp fileA user10@localhost:/home/user10
fileA                                        100%   23    30.3KB/s   00:00    

# 파일 가져오기 //디렉터리 복사시 -r 옵션 사용
[root@whynot_jung /]# scp -r user10@localhost:/home/user10/dirA /root
fileA                                        100%    0     0.0KB/s   00:00    
fileB                                         100%    0     0.0KB/s   00:00    
fileC                                         100%    0     0.0KB/s   00:00    

 

[root@whynot_jung /]# sftp user10@localhost
Connected to localhost.
sftp> ls
README  dirA    fileA   
sftp> pwd
Remote working directory: /home/user10
sftp> cd dirA/
sftp> ls
fileA  fileB  fileC  
sftp> get fileC /
Fetching /home/user10/dirA/fileC to /fileC
sftp> exit
[root@whynot_jung /]# ls
backup  bin  boot  dev  etc  fileC  home  lib  lib64  media 
mnt  opt  proc  project1  root  run  sbin  srv  sys  tmp  usr  var

 

 

2. NTP 서버 관리 (Network Time Protocol)

NTP(Network Time Protocol) 는 컴퓨터의 시스템 시간을 동기화 할 때 사용하는 프로토콜이다. 

인터넷에 연결되어 있는 시스템은 NTP 프로토콜을 사용하여 NTP 서버와 시간을 동기화 할 수 있다. 

NTP 서버는 1부터 15까지 단계(Stratum)로 구분되어있는데, 아래 그림과 같다. 숫자가 작을수록 시간이 정확하다.

출처: http://time.ewha.or.kr/

chrony 서비스를 이용하여 시간 동기화 수행. 

 

chronyd : chrony 서비스 데몬

chronyc : chronyd를 제어하기 위한 사용자 명령

 

/etc/chrony.conf 파일에서 설정 가능 혹은 chronyc 대화형 명령 프롬프트 사용도 가능! chronyc 치면 프롬프트 뜸!

# 동기화 시간 정보 확인
chronyc tracking
# 시간 소스 정보 확인 -v 옵션을 사용하면 더 자세한 정보 확인 가능
chronyc sources
chronyc sourcestats

 

3. 방화벽 관리

firewalld

- 실행(runtime) 중 설정과 영구(permanent) 설정이 있음. 실행중 설정은 재부팅 혹은 서비스 재실행 하면 사라짐. 

저장할 거면 permanent 로 해놓기

 

firewalld에는 영역(zone) 개념이 있는데, 연결 설정을 그룹처럼 묶어서 처리한다. 윈도우 방화벽에 가면 기본적으로 in- bound 규칙과 out-bound 규칙으로 나뉜 것처럼 firewalld 도 사전에 정의된 영역과 기본 영역이 있다. 

block (변경 X) 모든 패킷 거부(reject)
내부에서 외부 반환 패킷은 허용
dmz 내부로 들어오는 패킷 거부 (reject)
외부로의 연결, ssh 서비스 허용
drop (변경 X) 내부로 들어오는 모든 패킷 폐기 (drop)
ICMP (ping) 에러도 폐기
외부로 연결만 허용
external 내부로 들어오는 패킷 거부 (reject)
외부로의 연결, ssh 서비스 허용
IP Masqueranding 활성화
home 내부로 들어오는 패킷 거부(reject)
dhcpv6, ipp-client, mdns, samba-client, ssh 허용
internal 내부로 들어오는 패킷 거부(reject)
dhcpv6, ipp-client, mdns, samba-client, ssh 허용
public Default Zone
시스템에 인터페이스가 추가되면 인터페이스 규칙이 추가됨
내부로 들어오는 패킷 거부(reject)
dhcpv6-client, ssh 허용
trusted (변경 X) 모든 패킷 허용
work 내부로 들어오는 패킷 거부(reject)
dhcpv6, ipp-client, ssh 허용

 

firewall-cmd를 통해 커멘트라인에서 방화벽 관리를 할 수 있다.

#사전 정의된 영역 확인
[admin@server ~]$ sudo firewall-cmd --get-zones
work drop internal external trusted home dmz public block

#사전 정의된 서비스 확인
[admin@server ~]$ sudo firewall-cmd --get-services
....

#활성화된 영역 확인
[admin@server ~]$ sudo firewall-cmd --get-active-zones
public

#설정된 규칙 확인
[admin@server ~]$ sudo firewall-cmd --list-all --zone=home
home
  ...

# default zone 설정
[root@whynot_jung ~]# firewall-cmd --set-default-zone=external
success

# default zone 확인
[root@whynot_jung ~]# firewall-cmd --get-default-zone
external

# 각각 옵션 사용시 --permanent 를 써야 영구적으로(서비스 껐다켰을때도) 사용 가능함.

 

영역에 연결된 인터페이스 변경 : --change-interface=enp0s8 --zone=home

출발지 주소 추가 --add-source=[address] --zone=[zone] 

출발지 주소 삭제 --remove-source

서비스 추가 --add-service   (정의된 http: tcp/80)

서비스 삭제 --remove-serivce

 

포트 추가 --add-port=포트번호/프로토콜

포트 삭제 --remove-port=포트번호/프로토콜

--add-port=tcp/80

--add-port=tcp/4000

 

프로토콜 추가 --add-protocol

프로토콜 삭제 --remove-protocol

--add-procotol=icmp

 

리치규칙(rich rule)세부적으로 규칙을 설정하는 것

 

firewall-cmd --add-rich-rule='rule RULE' 

 

리치 규칙에 사용되는 문법

family IPv4 와 IPv6 결정 family={ipv4 | ipv6}
source 출발지 주소 설정 source address='IP/MASK'
destination 도착지 주소 설정 destination address='IP/MASK'
service 서비스 규칙 service name='SERVICE'
port 포트 설정 port port='PORT' 
protocol 프로토콜 설정 protocol value='PROTOCOL'
forward-port 포트포워딩 설정 forward-port port='PORT' protocol='TCP|UDP' to-port='PORT' to-addr='IP'
log syslog 기록 log PREFIX='TEXT' level='PRIORITY'
audit audit log 기록 audit
accept 허용
reject 거부
drop 폐기

위 문법을 사용하여 작성한 리치 규칙설정 예이다. 

firewall-cmd --zone=work --add-rich-rule='rule  family="ipv4" 
source address="192.168.0.0/24" service name="http" accept'

work 영역에 ipv4 192.168.0.0/24 에서 출발한 http서비스 패킷을 허용하는 리치 규칙을 추가해라.

 

 

여기까지 배우고 지난 시간~이번 시간 복습을 위한 퀴즈를 풀었다.

 

원래 매일 한 두시간씩 남아서 공부하다가 갔는데, 오늘은 그냥 6시에 집에 갔다. 

최근 며칠 간 늦게잤더니 피곤하고 어지럽고 해서 ㅠ.ㅠ

 

진짜 커리큘럼 빡세다. 여기에 학교 졸업을 위해 여름 계절학기 C프로그래밍실습과목도 듣고있다. 그거 과제까지 하느라 늦게 잔다. 열심히 해서 좋은 개발자 || 보안 전문가가 될거다! 물론 돈도 많이 벌거고 ㅋㅋㅋㅋㅋ 홧팅

반응형