Log Server(Rsyslog를 활용한 원격 로그서버)

OS의 종류를 막론하고 서버, 시스템을 관리하는 시선에서의 로그(Log)는 굉장히 중요한 파일이자 증거물이다.

 

로그는 커널, 보안관련, 서비스 등지에서 발생하는 이벤트에 대해 기록되는 것으로,

기본적으로 리눅스에서는 'rsyslog' 패키지의 데몬을 통해서

로컬(/var/log/~) 혹은 원격 로그 서버(Remote Log Serverr)에 저장하게 된다.

(FTP, DB, HTTP .. 등의 메인 서버에서 발생하는 로그의 관리방식)

 

로컬 머신에 저장되는 로그의 경우 해커가 작업을 마친 후 로그를 삭제하면

그 증거를 찾아내기 어려워지지만, 실시간으로 발생하는 로그를 

원격지의 서버로 SSH를 통하여 전송하여 통합 저장 및 관리를 한다면

보다 안전하고 효율적으로 관리할 수 있을 것이다.

 

* 실습환경 : Intel i7-1260P(AMD64)

** 네트워크 대역 : 192.168.100.0/24

*** 해당 실습에서 사용된 가상 머신 : CentOS 1(LogServer .140), CentOS 2(Client, ditto.com, .160),

Ubunser(.135)

 

 

● Rsyslog를 활용한 원격 로그서버 구축

# CentOS7 1(.140 == Remote Log Server)

# rsyslog 패키지를 설치(대부분 기본 패키지로 설치 되어있음)
sudo yum install -y rsyslog

# 기본 설정파일 백업 생성
sudo cp -arp /etc/rsyslog.conf /etc/rsyslog.conf.bak

 

# rsyslog 서버의 /etc/rsyslog.conf 파일 내용 수정

[파일 내용]
14 # Provides UP syslog reception
15 $ModLoad imudp
16 $UDPServerRun 514

18 # Provides TCP syslog reception
19 $template TemlAuth, "/var/log/%HOSTNAME%/PROGRAMNAME%. log"
20 *.*?TemlAuth
21 $ModLoad imtcp
22 $InputTCPServerRun 514

# 원격 로그 서버로 사용될 머신에서 514포트(syslog Protocol) 부분의 주석을 해제
# 19번 째 라인을 보면 새로운 템플릿을 정의한 후 원격지(클라이언트)에서 수신받는 로그의 저장 경로를 지정
# 20번 째 라인의 경우 모든상황에 대한 모든 메시지를 수신한다는 의미

[파일수정 완료 후]
sudo firewall-cmd --permanent --zone=public --add-port=514/tcp
sudo firewall-cmd --permanent --zone=public --add-port=514/udp
sudo firewall-cmd --reload

sudo systemctl restart rsyslog && sudo systemctl status rsyslog

# 방화벽 설정 적용과 수정내용 적용을 위한 재시작을 실행

 

/etc/rsyslog.conf

 

 

포트 개방 상태를 확인

 

 

▼ Centos7 2(.160, Client)

/etc/rsyslog.conf

"*.info;mail.none;cron.none@192.168.100.140(원격 로그 서버의 IP주소)"

info 레벨의 로그를 전송하는데, mail과 cron에서 발생한 이벤트에 대해서는 전송하지 않는다는 의미를 가진다.

 

 

서비스 재시작

설정파일 적용을 위해 서비스를 재시작 후 상태를 확인한다.

 

 

▼ Ubunser(.135, SSH Client)

로컬의 다른 가상머신에서 원격 접속을 시도(비밀번호 2회 오류 후 접속)

 

▼ 결과물(Report)

LogServer에서 'ditto' 호스트의 sshd.log 정보를 확인

 

LogClient에서 자신의 로그파일을 확인

몇 분 차이로 클라이언트 머신에서는 다른 이벤트가 발생하여 내용이 추가되었지만,

서버의 SSHD 관련 로그와 내용을 비교 해보았을 때, 내용이 일치하는 것을 확인할 수 있다.

동기화가 정상적으로 이루어졌다는 의미

'Linux_System' 카테고리의 다른 글

[Linux]DHCP  (0) 2023.02.10
[Linux]Squid(Proxy_Server)  (0) 2023.02.09
[Linux]Ansible  (0) 2023.02.04
[Linux]YUM_Priority  (0) 2023.01.18
[Linux]ZFS  (0) 2023.01.16

DHCP(Dynamic Host Configuration Protocol)

DHCP란 호스트들의 IP, Gataway, DNS 서버를 자동으로 할당해주는 프로토콜로,
과거 BootP(디스크가 없는 컴퓨터에게 IP 주소 및 구성정보를 자동으로 설정)의 상위버전으로 볼 수 있다.

LAN 구성도

위의 그림과 같이 조직 내부에서 지정된 범위의 IP를 자동으로 할당해주는 서버를
리눅스로 구성해보겠다.

* 실습환경 : Intel i7-1260P(AMD64)
** 네트워크 대역 : 192.168.100.0/24
*** 해당 실습에서 사용된 가상 머신 : Ubunser20.04(.145), CentOS7
(.DHCP), Windows7(.DHCP)

● DHCP 서버 구축

VMWare Edit Tab -> Virtual Network Editor

현재 실습환경은 물리적인 노드가 아닌 VMWare 안의 가상머신으로 진행되기 때문에
VMWare 메인 네트워크 어댑터를 통한 자동 IP할당 옵션을 체크해제

# DHCP 서버 구축을 위해 필요한 패키지 설치(Ubuntu Server 20.04 기준 패키지)
sudo apt install -y isc-dhcp-server

# Default 설정파일을 백업
sudo cp -arp /etc/dhcpd.conf /etc/dhcpd.conf.bak


# dhcpd.conf 파일을 수정하여 설정사항을 저장
sudo vim /etc/dhcpd.conf

[파일내용]
# A slightly different configuration for an internal subnet.
subnet 192.168.100.0 netmask 255.255.255.0 {
  range 192.168.100.210 192.168.100.215;
  option domain-name-servers 192.168.100.2;
  option domain-name "ditto.com"
  option subnet-mask 255.255.255.0;
  option routers 192.168.100.2;
  option broadcast-address 192. 168.100.255;
  default-lease-time 600;
  max-lease-time 7200;
}

# DHCP 할당 시켜줄 네트워크 대역을 정의 192.168.100.0/24
# DHCP 할당 시켜줄 네트워크의 범위를 설정 .210 ~ .215까지 할당
# DNS를 설정 192.168.100.2(Default)
# Domain Name을 설정 "ditto.com"
# 기본 대여 시간 600초, 최대 대여 시간 7200초로 설정됨


sudo iptables -I INPUT 1 -p udp -m state --state NEW --dport 67 -j ACCEPT

DHCP의 포트 번호로는 서버(67번) / 클라이언트(68번)을 사용하며
클라이언트가 IP 할당을 위해 요청을 할 수 있게끔 67번 포트를 활성화해준다.

iptables를 이용하여 INPUT 체인에 67번 포트에 관한 룰을 추가해준다.
(sudo ufw allow ~ 를 이용하여 대체할 수 있음)

sudo /etc/init.d/isc-dhcp-server start

해당 명령어를 이용하여 서비스 시작 또는 재시작이 가능하며,
보편적으로 systemctl [Option] [Service] 를 이용하여 서비스를 시작해준다.

▼ CentOS7(DHCP 클라이언트)

# 기존 Static(정적)으로 설정 되어있던 CentOS7의 네트워크 설정파일을 수정
sudo vim /etc/sysconfig/network-scripts/ifcfg-ens33

[파일 내용]
TYPE="Ethernet"
PROXY METHOD="none"
BROUISER ONLS="no
BOOTPROTO="dhcp"			# BOOTPROTO = "dhcp" 설정
DEFROUTE "yes"
IPU4_FAILURE_FATAL = "no"
IPUGINIT-"yes"
IPU6 _AUTOCONF="yes"
IPV6 _DEFROUTE-"Jes"
IPUG FAILURE FATAL= "no"
IPU6_ADDR_GEN _MODE-"stable-privacy"
NAME-"ens33"
UUID="3c9ae2f6-bf1a-469a-8217-ca99bce784ff"
DEUICE="ens33"
ONBOOT-"ues"
#IPADDR="192.168.100.160"
#PREFTX=124*
#GATEWAY="'192.168.100.2"
#ONS1="192.168.100.2"
10052=44192.168. 190 :7.
#DNS3="8.8.8.8"				# 기존에 정적으로 설정되었던 부분은 주석처리

CentOS7

CentOS7

설정파일 수정 및 저장 후,
"sudo ifdown ens33 && sudo ifup ens33"
명령으로 네트워크 카드를 재시작해보면
DHCP 범위의 첫 번째 주소인 .210 으로 할당된 것을 확인해볼 수 있다.


▼ Windows 7(DHCP 클라이언트)

Windows 7

윈도우 탭 -> 네트워크 -> 네트워크 속성(R) 탭을 클릭하여
수동으로 지정 되어있던 IP 설정을 자동으로 변경해준다.

Windows 7

설정을 마친 후 윈도우 명령 프롬프트에서 "ipconfig" 로 네트워크 정보 확인 시
DHCP 할당 범위에 속하는 ~.211로 IP가 설정된 것을 확인할 수 있다.

▼ Ubunser(DHCP 서버)

sudo dhcp-lease-list

해당 명령어로 현재 IP주소를 부여받은 노드들의 정보를 확인해볼 수 있다.




'Linux_System' 카테고리의 다른 글

[Linux]Log_Server  (0) 2023.02.10
[Linux]Squid(Proxy_Server)  (0) 2023.02.09
[Linux]Ansible  (0) 2023.02.04
[Linux]YUM_Priority  (0) 2023.01.18
[Linux]ZFS  (0) 2023.01.16

Squid를 활용한 Proxy서버 구축

Proxy서버는 Cache서버 라고도 불리우며 네트워크 상의 각 노드들이
네트워크 서비스(외부:WAN)으로 접속하려 할 때, 각 노드들이 기존에 접속했던 정보를 쿠키(Cookie)로 보유함으로써
내부 네트워크 (내부:LAN)와외부 네트워크 서버 사이에서 연결에 대한 도움을 주는 중계기 같은 역할을 하는 서버이다.

네트워크 구성도

예를들어 위와 같은 그림의 구조를 가진 네트워크에서 1 ~3 번 노드들이
기존에 접속했었던 서버의 정보(쿠키)를 프록시 서버에 저장 해두었다가.
추후 동일한 서버로의 접속을 요청하면 외부(ex. Global DNS)로 쿼리를 하지않고,

내부의 프록시 서버가 경로를 지정해주므로 경로가 단순화 될 수 있다는 장점(트래픽 감소)이 존재하며
유해 사이트 및 접근해서는 안되는 서버를 ACL로 Permit, Deny로 통제해주는 역할을 수행한다.

많이 사용하게 되는 웹 브라우저에 프록시 서버를 지정하여 접속 제한을 하는 진행

* 실습환경 : M1 Based Mac(ARM64)
** 네트워크 대역 : 10.211.55.0/24
*** 해당 실습에서 사용된 가상 머신 : Fedora(.30= Proxy Server), Fedora(.20 = Just Node..)

● Proxy Server 구축

sudo dnf install -y squid

프록시 서버 구축을 위한 Squid 패키지를 다운로드

# 원본파일 백업
sudo cp -arp /etc/squid/squid.conf /etc/squid/squid.conf.bak

# Squid 설정파일 수정
sudo vim /etc/squid/squid.conf

[squid.conf 수정내용]
2 # Recommended minimum configuration:
5 # Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
7 # should be allowed
8 acl bad url_regex -i "/etc/squid/blocked"	### 해당부분에 룰과 참조파일 경로를 지정
9 acl localnet sc 0.0.0.1-0.255.255.255
10 acl localnet sc 10.0.0.0/8
11 acl localnet sc 100.64.0.0/10
12 acl localnet sc 169.254.0.0/16
13 #acl localnet sc 172.16.0.0/12
14 acl localnet sc 10.211.55.0/24
.
.
.
52 # Example rule allowing access from your local networks.
53 # Adapt localnet in the AL section to list your (internal IP networks
54 # from where browsing should be allowed
55 http access allow localnet !bad			### bad로 지정되지 않는 IP접속은 허가
56 http_access allow localhost

58 # And finally deny all other access to this proxy
59 http_access deny all

61 # Squid normally listens to port 3128
62 http port 3128							### Proxy 서버로 사용할 Port 번호
63 # Uncomment and adjust the following to add a disk cache directory.
64 #cache dir ufs /var/spool/squid 100 16 256

66 # Leave coredumps in the first cache dir
67 coredump_dir /var/spool/squid


/etc/squid/squid.conf
/etc/squid/sqiud.conf


# 차단될 FQDN(목적지)가 정의된 파일생성
sudo vim /etc/squid/blocked

[파일내용]
1 www.youtube.com
2 .daum.net
3 .naver.com

# 앞 부분 ~.[FQDN]을 사용하면 프로토콜과 관계 없이 도메인 전체차단의 효과
# 정규표현식의 Asterisk(*)과 유사한효과


[방화벽 설정]
sudo firewall-cmd --permanent --zone=public --add-service=squid 
sudo firewall-cmd --reload
sudo firewall-cmd --list-services

[포트확인 Open상태 확인]
sudo ss -nltp | grep LISTEN
방화벽과 포트 LISTEN 상태를 확인



● Fedora(.20 = Node)에서 프록시 서버를 지정

Firefox

웹 브라우저 우측 상단의 삼단바를 클릭하여 Setting 클릭 후,
설정 페이지로 접근

Firefox

우측의 검색창에 'proxy'를 입력 후 검색

Firefox

'Manual Proxy Configuration' 체크란에 체크 후, 앞에서 프록시 서버로 구축한
프록시 서버의 주소(10.211.55.30)와 포트번호 '3128'을 기재하여 저장

Firefox

앞에서 정의한 'blocked'에 지정 되어있지 않은 facebook 웹 사이트 접속은 정상적으로 가능

Firefox

차단 목록에 포함 되어있는 ~.naver.com 사이트 접속요청 시
'The Proxy server is refusing' 이라는 경고문과 함께
접근이 차단되는 것을 확인할 수 있다.

'Linux_System' 카테고리의 다른 글

[Linux]Log_Server  (0) 2023.02.10
[Linux]DHCP  (0) 2023.02.10
[Linux]Ansible  (0) 2023.02.04
[Linux]YUM_Priority  (0) 2023.01.18
[Linux]ZFS  (0) 2023.01.16

Ansible(앤서블)

Ansible은 오픈 소스 자동화 도구로써 2012년 경에 개발되어 현재는 RedHat사에 인수되었다고 한다.
해당 도구의 쓰임새로는 기존 수동으로 진행하던 시스템 준비절차(Provisioning),
서비스 배포(Service Deployment), 작업 자동화 ... 등

작업의 단순화, 관리 및 편의성을 위하여 사용되는 도구이며
SSH(Secure SHell)을 통하여 작동되고 대부분의 플랫폼에서 동작한다.
ex) Onpremise, Cloud, Virtual ...

이와 비슷한 도구로 Puppet 이라는 도구가 존재하는데,
Puppet과 Ansible의 가장 큰 차이점으로는

 

1. Master, Agent Node의 구분여부

2. 각 도구의 동작방식

Ansible = 서버 → 클라언트(Push)
• Puppet = 클라이언트 → 서버(Pull)

 

3. 사용되는 명세파일(Manifest)의 형식

• Ansible = *.yml
• Puppet = *.pp
. . .

원리를 이해하기 위해 가장 간단한 설정 방식으로 실습을 진행
* 실습환경 : M1 Based Mac(ARM64)
** 네트워크 대역 : 10.211.55.0/24
*** 해당 실습에서 사용된 가상 머신 : Fedora(.20) = Client, Ubunser(.60) = Server

● Ansible 실습

# Ubunser(.60)에서 Ansible 패키지를 다운로드
sudo apt install -y ansible

# Ansible 클라이언트에 대한 정보를 등록
sudo vim /etc/ansible/hosts

 18 # Ex 2: A collection of hosts belonging to the 'webservers' group
 19 [ansible_client]
 20 10.211.55.20 ansible_ssh_user=root ansible_ssh_pass=rootoor

# PublicKey를 이용한 인증방식이 가장 안전하지만 실습 편의를 위해서
# PasswordAuthentication를 통한 인증을 활성화 시켜주었다.

 

/etc/ansible/hosts

* 키가 아닌 일반 패스워드 사용 시 위 그림처럼 설정파일에 평문장으로 저장된다

(위험성 증가로 인해 대부분 사용 x)

 

 

다음으로 호스트에게 전달되어 수행할 작업이 정의되어 있는
명세파일(Manifest File)을 yaml 형식으로 생성한다.

 

# 'sample.yml' 이름의 yml 파일 생성
[centos@localhost ~]$ sudo vim sample.yml

(sample.yml 파일내용)
---
- name: sample book
  hosts: ansible_client
  remote_user: root
  become: true
  tasks:
    - name: install httpd
      dnf:
        name: httpd
        state: latest
    - name: run httpd
      service:
        name: httpd
        state: started
    - name: create content
      copy:
        content: "This is Ansible Test Web Server"
        dest: /var/www/html/index.html
        
# 원격 호스트에 ssh로 접속하여 자동으로 수행될 작업들이 json 형식으로 정의 되어있는 것을 확인할 수 있다.
# yaml 파일의 경우 문법에 굉장히 민감한 형식으로, 현재 코드블럭과 동일한 공백과 문자를 갖을 수 있도록 주의

''' 
작업내용 :
Ansible 클라이언트인 Fedora(.20)의 관리자의 권한으로 'httpd(Latest Ver.)' 패키지를 다운로드,
'/var/www/html/index.html' 파일에 임의의 웹 문서 생성
'httpd' 서비스를 시작
'''

 

sudo ansible-playbook sample.yml --syntax-check

(좌) : 정상표시 / (우) : 오류표시

 

해당 명령어로 작성된 명세파일의 구문오류 혹은 Ansible의 종속 파일과
연결성에 대한 코멘트를 확인할 수 있다. 오류의 내용은 해석하기 어렵지 않으니
조금만 신경써서 읽으면 대부분 간단하게 해결 가능하다.

여기까지 특별한 오류없이 명세파일 작성까지 완료되었다면,
Anisble Server 에서의 설정은 완료됐다.

 

● Ferdora(.20) 원격 접속을 위한 설정

/etc/ssh/sshd_config

키를 이용한 작업 수행 시에는 해당되지 않지만 지금처럼
'root'의 패스워드를 이용하여 직접 'root'의 권한으로 작업 진행 시
근본적으로 root의 패스워드가 설정되어져 있어야 한다.

그리고

SSH 설정 파일에서 미리 RootLogin, PasswordAuthentication 항목을 활성화 해준 뒤,
SSH 서비스를 재시작하여 변경 내용을 저장해준다.

▼ 해당 사항 미설정 시 발생되는 오류의 내용

 

sudo systemctl status httpd

설정파일 수정을 마친 뒤,
현재는 존재하지 않는 httpd 서비스의 상태를 확인

다시 Ansible 서버로 돌아와서

# Ansible-playbook으로 작업 자동화를 시작
sudo ansible-playbook [Manifest File]


실행 시 아래 그림과 같은 에러 메시지가 출력되는 것을 확인할 수도,
없을 수도 있지만 시스템에 아무런 및 패키지 설치없이 실습을 진행 시
다음에 해당하는 에러 메시지를 확인할 수 있다.

▼ 에러 메시지 (1)

" ~ you must install the sshpass program ~ "

메시지의 핵심 구문이다. key가 아닌 password 인증 방식의 ssh 연결을 원한다면
'sshpass' 라는 프로그램이 필요하니 설치하라는 의미

현재처럼 '원격 자동화 작업' 시 SSH의 기존 대화형 인증방식이 아닌
비대화형 인증 방식으로 미리 지정된 파일에 정의 되어있는 원격지의 패스워드를
프로그램 자체에서 읽어들여 사용자의 입력 없이 자동으로 접속을 하게끔 해주는 도구이다.
* 이 부분은 운영체제의 버전 및 레포지토리 별로 약간씩은 차이가 있는 듯 하다


▼ 에러 메시지 (2)

" ~ Please add this host's fingerprint to your known_hosts file ~ "

연결하려는 클라이언트와의 접속 내역(신뢰성)이 없는 경우 발생하는 에러 메시지이다.
이 부분은 현재 실습에서 키가 아닌 패스워드를 이용한 인증으로 인한 부분이라고 생각된다.

ssh [User]@[Client IP]

없다면 만들어주면 된다. 패스워드를 이용하여 SSH 접속을 최초로 요청하면
빨간 상자 안에 표기되어 있는 내용과 같은 알림 문구를 확인할 수 있다.

이렇게 원격 자동화 작업을 하고자는 클라이언트의 SSH 정보를
~/.ssh/known_hosts 파일에 저장하여 추후 연결시에는
해당 질문은 생략된다.

* 간혹 다른 실습을 동시에 진행하며 ssh 관련 파일 및 네트워크가 변경되어
known_hosts에 저장 되어있는 정보와 다를 경우에도 위의 그림과 같은 에러가 발생하니
그럴 때에는 과감히 삭제해주고 새롭게 세션을 형성하여 known_hosts 파일을 갱신해주자

이렇다할 이슈들을 모조리 잡아낸 뒤,

명령어 실행 시 특이사항 없이 정상적으로
작업이 수행되는 모습을 태스크 별로 확인할 수도 있다.

fedora에서 httpd 서비스를 다시 확인

ansible로 작업 수행 전 확인했을 때와 달리
설치와 서비스 시작까지 정상적으로 진행된 모습을 확인

 

firefox http://10.211.55.20

명세파일에 정의된 대로 html 내용이 fedora 웹 서버에 적용된 것을 확인

실습만 봤을 때에는 효율에 대해 의문을 가질 수 있지만,
클라이언트가 수십 ~ 백 개 정도 된다고 가정 해본다면
해당 관리 시스템의 매력을 알아볼 수 있을 것이다.

추후에는 이보다 조금 더 발전시킨 버전의 ansible 실습을 진행해보겠다.
사실 Ansible은 온 프레미스 환경도 좋지만,
클라우드 환경에서 그 진가를 발휘한다고 한다.

'Linux_System' 카테고리의 다른 글

[Linux]DHCP  (0) 2023.02.10
[Linux]Squid(Proxy_Server)  (0) 2023.02.09
[Linux]YUM_Priority  (0) 2023.01.18
[Linux]ZFS  (0) 2023.01.16
[Linux]PAM  (0) 2023.01.12

패키지 저장소 우선순위(Priority)

yum은 여러 원격지에서 패키지를 찾기, 제거, 설치 및 갱신등의 작업을

관리자가 보다 손쉽게 해줄 수 있도록 도와주는 역할을 한다.

 

하지만 이런 편리성에도 참고되는 저장소가 많아질수록

충돌발생의 가능성이 가증되어 패키지 관련 작업에 오류가 발생할 수도 있다.

 

충돌이 발생하지 않도록 저장소를 참고하는 순서를 정해주는 방법이다.

(CentOS7/Kernel3.10 환경에서 테스트를 진행)

 

 

▼ 내부 저장소 구축 참고 포스트

 

[Linux]YUM_LocalRepository

YUM(Yellow dog Update Modified) Repository 우리가 리눅스(RHEL 계열)에서 프로그램의 설치/삭제를 도와주는 패키지 관리 도구이다. 여기서 '도와주는' 이라고 표현을 했는데, 그 이유는 저 수준(Low Level) 패

for-security.tistory.com

 

 

●  yum-plugin-priorities

sudo yum install -y yum-plugin-priorities

repository(저장소)에 우선순위를 부여하기 위해 필요한 도구를 받아준다.

이 때, 현재는 별도의 우선순위를 부여하지 않았기 때문에 'base' repository에서

패키지를 다운 받아오는 것을 확인할 수 있다.

 

 

cat /etc/yum/pluginconf.d/priorities.conf

앞에 설명된 패키지를 다운받았다면 'etc' 하위에 'yum' 디렉토리가 생성될 것

 

 

vim /etc/yum.repos.d/local-repo

앞에서 추가한 로컬 저장소(Local Repository)파일에

priority 섹션을 추가한 후 '0(=숫자, 가장 우선적으로 적용됨)'을 추가해준다.

 

 

vim /etc/yum.repos.d/CentOS-Base~.repo

Default로 생성 되어있는 'Base' 파일에서도

각 리포지토리에 priority 섹션을 추가하여 1 -> 2 -> 3 순으로 우선순위를 지정

 

 

sudo yum install -y nmap

기본 설정에서는 가장 우선이였던 'base' 리포지토리에서 파일을 찾아오는 것에 반해,

우선순위가 '0'으로 가장 높은 'local' 리포지토리에서 패키지를 받아오는 것을 확인

 

'Linux_System' 카테고리의 다른 글

[Linux]Squid(Proxy_Server)  (0) 2023.02.09
[Linux]Ansible  (0) 2023.02.04
[Linux]ZFS  (0) 2023.01.16
[Linux]PAM  (0) 2023.01.12
[Linux]Process(2)_top  (0) 2022.11.08

ZFS(ZettaByte File System)

2001년에 Sun Micro Systems에서 개발하여 Open Solaris에 적용되었고, 2008년에 FreeBSD와 Linux에 배포되었다.

ZFS 파일 시스템은 파일 시스템 관리의 혁신을 일으킨 파일 시스템으로

풀(Pool)기능, 자체적인 RAID(RAID_Z) 설정, Copy-on-Write 기능, 128bit 파일 시스템으로 

거의 무한대에 준하는 저장용량을 자랑하는 파일 시스템이다.

 

 

● ZPool의 종류

- Stripped : RAID 0와 유사한 그루핑 방식으로 읽기/쓰기 속도의 향상을 위함

- Mirroring : 1개의 Disk Storage  + 1개의 Mirroring Disk = 총 2개의 Disk(디스크 클론)

- RAID-Z1 : 2개의 Disk Storage + 1개의 Parity Disk = 총 3개의 Disk

- RAID-Z2 : 2개의 Disk Storage + 2개의 Parity Disk = 총 4개의 Disk

- RAID-Z3 : 2개의 Disk Storage + 3개의 Parity Disk = 총 5개의 Disk

 

 

● Copy-on-Write

일반적인 파일 시스템에서 데이터가 겹쳐 쓰여지면 이전 데이터는 삭제되지만,

ZFS의 경우 새로운 데이터를 기존 파일과는 다른 블록에 써서 쓰기가 끝나면 파일 시스템의 메타데이터가 업데이트되어

새로운 데이터를 가리키게 되어서 시스템 크래시 시에도 기존 데이터가 자동으로 보존되게 한다.

 

 

● ZFS on Ubuntu 20.04

1GB 용량의 하드 디스크 2개를 가상머신에 추가

ZFS 파일 시스템을 테스트로 적용하기 위한 하드 디스크 2개를 추가

  

 

sudo apt-get install -y zfsutils-linux

우분투의 Repository에는 ZFS 패키지가 준비되어 있기 때문에 별도의 저장소 수정 없이

다운로드 받아 사용가능

(이 외의 OS에서도 레포지토리를 추가하여 패키지 다운로드가 가능하다)

 

 

새롭게 추가된 하드 디스크 두 개의 블록 장치명은 각각 sdb, sdc 이며,

여기서부터 일반적인 파일 시스템과는 차이점이 발생됨

 

기존 fdisk /dev/[Block Device] 방식으로 파티션과 포맷을 진행하는 것과 달리

zpool을 생성하며 파티션, 포맷, 디스크 그루핑(RAID)을 동시에 수행하는 것을 확인할 수 있음

 

 

ls /dev/sd*

sdb, sdc 블록 장치가 ZFS 파일 시스템으로 포맷된 것을 확인할 수 있음

 

 

zfs create -p zfspool/data
zfs create -p zfspool/apps
zfs create -p zfspool/data/charlie
### 생성된 zfs pool에 테스트를 위한 디렉토리를 새롭게 생성

 

 

zfs list

mirroring으로 구성되어 AVAIL(사용 가능한 공간) 819MB로 표기되는 것을 확인할 수 있음

 

 

1GB 용량의 하드 디스크 2개를 가상머신에 한번 더 추가

기존 ZPool의 용량을 증설하기 위해서 같은 크기의 하드 디스크를 추가한다.

 

 

sudo zpool add zfspool mirror /dev/sd[de]

기존에 생성된 ZPool인 zfspool에 같은 mirroring 방식의 디스크를 추가한다.

이 과정에서도 기존에 저장장치를 증설하는 방식과 엄청난 차이점이 존재한다.

마운트 해제, 디스크 파티셔닝, 포맷 ... 등의 과정이 전부 생략되고

명령어 한 줄로 이 모든것을 통제한다.

zfs list

ZPool을 증설한 뒤 해당 명령어로 증설된 용량을 확인해보면,

AVAIL = 1.74GB로 별도의 번잡한 과정없이 같은 속성의 디스크가

추가 되었음을 확인이 가능하다.

 

 

zpool status

해당 명령어로 현재 생성된 혹은 사용중인 zpool의 정보를 트리형식으로 확인이 가능하다.

 

zfspool의 구성으로는 mirror-0과 mirror-1이며,

mirror-0의 경우 sdb, sdc가 결합되어 생성된 mirroring 저장 장치임을 알 수 있고,

mirror-1의 경우 sdd, sde가 결합되어 생성된 mirroring 저장 장치임을 확인 할 수 있다.

 

 

● ZFS  Snapshot

sudo zfs snapshot zfspool/data/charlie@20220116

해당 명령어로 현재 상태에 대한 스냅샷 생성이 가능하다.

현재 'zfspool/data/charlie/' 디렉토리 내에는 test1, test2, test3, test4 

총 4개의 파일만 존재하는 상태이다.

 

 

echo "This is for test" > /zfspool/data/charlie/temporary.txt

해당 디렉토리에 'temporary.txt'라는 이름을 가진 파일을 추가로 생성하였다.

사진에서 보면 알 수 있듯이 기존파일 외에 'temporary.txt' 파일이 추가된 것을 확인할 수 있다.

(허가권 설정을 잘 못 하여 부득이하게 root 에서 작업함)

 

 

zfs rollback zfspool//data/charlie@20220116

위의 명령어로 스냅샷을 찍어둔 시점으로의 복구가 가능하며,

이 전의 상태(temporary.txt 파일이 존재하는 상태)에서 별도의 스냅샷을 생성한 것이 아니라면 해당 상태로 돌아가는 것은 불가능하다.

 

여타 스냅샷 파일과 동일하게 찍은 즉시에는 스냅샷에 대한 데이터 크기의 변경이 발생되지 않지만

"활성 데이터 세트 내의 데이터가 변경되면 스냅샷은 기존 데이터를 계속 참조하기 위해 디스크 공간을 사용한다."

라고 설명되어 있다.

참조 : https://docs.oracle.com/cd/E26925_01/html/E25825/gbciq.html 

 

현재까지는 최신의 파일 시스템으로, 안정성 면에 있어서 미지수라는 글들이

많이 보이는 것 같다.

 

'Linux_System' 카테고리의 다른 글

[Linux]Ansible  (0) 2023.02.04
[Linux]YUM_Priority  (0) 2023.01.18
[Linux]PAM  (0) 2023.01.12
[Linux]Process(2)_top  (0) 2022.11.08
[Linux]Process(1)_ps  (0) 2022.11.05

PAM(Pluggable Authentication Module)

PAM/etc/pam.d에 있는 모듈별 파일로 인증을 관리하는데,

/etc/crond, /etc/ssh/sshd_conf ... 등의 해당 패키지의 기본 설정파일에서 각각 해당 모듈에 대한 사용자 인증을 설정할 수 있지만

PAM을 통하여 접근 인증을 하게되면, 기존의 서비스 마다 인증을 해야하는 방식 보다는

효율적이며 인증요청 시 서비스가 직접 인증을 하는 것이 아닌,

PAM을 통해 인증을 받기 때문에 정책 설정이 용이하며 일관성 있는 인증 관리가 가능하다는 점이 존재한다.

 

 

● PAM의 형태

cat -n /etc/pam.d/

모든 서비스가 PAM 을 사용할 수 있는 것은 아니며,

Linux PAM API로 개발된 라이브러리를 사용하는 서비스여야 PAM 사용이 가능하다.

 

cat -n /etc/ssh/sshd_config

현재 ssh 서비스는 'UsePAM yes' 상태로 인증에 관한 통제를 PAM을 통하여 하고있는 것을 알 수 있다.

 

cat -n /etc/pam.d/sshd

설정파일의 세 가지 항목으로

[auth type] [control flag] [module] 있으며,

 

▶︎ auth type : 사용자 인증, 사용자를 룰에 의해 관리할 때 사용하며

▶︎ control flag : 모듈의 성공 및 실패 시, '최종 성공' '다음 룰 진행' '최종 실패' 여부를 정함

▶︎ module : 룰에서 사용될 모듈을 지정

 

ls /lib64/security OR ls /lib/security

PAM 이 Default로 참조하는 모듈이 있는 장소이다.

참조해야 할 모듈이 해당 경로에 있는 것이 아니라면,

링크를 걸어주거나 절대경로 값을 입력해야한다.

 

 

● wheel 그룹만 su command 사용이 가능하게끔 통제

vim /etc/pam.d/su

주석처리 되어있는 빨간색 박스부분의 룰을 주석 해제하여 활성화 후 저장해준다.

해당 PAM 모듈(pam_wheel.so)의 인자(argument)로는 현재 사용중인 유저의 UID이다.

인증을 시도한 유저의 UID가 wheel 그룹에 포함 되어있지 않으면, 최종실패라는 결과를 도출하는 것

 

grep wheel /etc/group

wheel 그룹에 'fedora', 'park' 유저만 가입되어 있는 것을 확인

 

(좌) User : 'abc' / (우) User : 'park'

그림으로도 확인이 가능하듯, wheel 그룹에 소속되어 있지 않은 abc유저의 경우

기존 root의 패스워드를 알고있다면 사용이 가능했을 'su' 커맨드인데

PAM 모듈을 통한 인증 때문에 접근거부 된 것을 확인

'Linux_System' 카테고리의 다른 글

[Linux]YUM_Priority  (0) 2023.01.18
[Linux]ZFS  (0) 2023.01.16
[Linux]Process(2)_top  (0) 2022.11.08
[Linux]Process(1)_ps  (0) 2022.11.05
[Linux]Software_Compile  (0) 2022.10.31

top(Table Of Process)

저번 포스팅에서는 개별 프로세스 조회 중점의 명령어인 ps에 관해서 알아 봤다.

이번에는 좀 더 구체적으로 어느 프로세스가 리소스의 어느 정도를 점유하며,

전체 프로세스를 실시간으로 확인할 수 있는 명령어인 top에 대해 알아보자

 

● 명령어 'top'의 활용방식

아무런 옵션 없이 'top' 명령어를 실행했을 때의 출력화면

빨간색 실선 안의 정보들은 시스템의 가동시간, 평균 부하값(Load Average), 메모리의 상태 등의

자원에 관한 간략한 정보가 표기되어 있으며, 하단의 노란색  실선 안의 정보들은 프로세스들의 정보

담고있는 것을 확인할 수 있다. 그림의 왼쪽부터 필드의 정보를 서술하면 

 

- PID : 프로세스 ID

- USER : 프로세스의 소유자

- PR : 프로세스의 우선순위

- NI : 작업의 nice값

- VIRT : 프로세스가 사용중인 가상메모리 양

- RES : 물리적인(실제의) 메모리의 양

- SHR : 공유 메모리의 양

- S : 해당 프로세스의 상태 (Status)

- %CPU : CPU 사용량

- %MEM : 현재 사용중인 실제 메모리의 양

- TIME+ : 프로세스가 CPU를 사용한 시간

- COMMAND : 프로세스가 시작되는 데에 사용된 명령어

 

각각 의미하며, 

콘솔창에 'top' 실행 시 사용되는 옵션으로는 'top -d [초(Sec)]'와 'top -b(배치모드)'가 있는데,

'-d' 옵션의 경우 top의 정보 갱신주기를 설정하는 옵션이고

배치모드로 프로세스의 흐름을 확인 하기에는 시인성이 좋지 않아 거의 사용되지 않는다고 한다.

굳이 옵션을 입력하지 않고도 'top' 화면에 진입하여 Space Bar, Enter 키를 입력하면 

그때 그때 갱신되도록 설정되어 있다.

 

 

● 목록별 정렬

'top' 실행화면 중 Shift+p를 입력해 CPU 사용률 기준으로 정렬

- Shift+p : CPU 사용량 기준 정렬

- Shift+t : CPU 사용 시간별 정렬

- Shift+m : 메모리 사용량 기준 정렬

  - Shift+n : PID 기준 정렬

 

등의 명령어로 시인성 좋게 실행중인 프로세스를 확인할 수 있다.

 

 

● 사용자별 정렬

'top' 실행화면 중 Shift+u를 사용하여 'centos' 사용자의 프로세스를 검색

'Shift+u' 입력 후 'Which User (blank for all)' 입력창에 사용자의 ID를 입력하면

해당 사용자가 실행중인 프로세스를 확인할 수 있다.

 

 

● 프로세스 제어

'top' 실행화면 중 'k(시그널)' 키를 입력하여 프로세스를 제어

가장 간단한 예시로 현재 실행중인 임의의 프로세스

'vim /etc/passwd' 종료를 시도, 해당 명령행에 PID(4622)를 입력하면

 

원하는 SIGNAL값을 입력하라는 명령행이 나온다. 여기서 

SIGKILL 의 값인 숫자 9 입력 후 엔터를 치면 해당 프로세스가 

강제로 종료되는 것을 확인할 수 있다.

 

 

 

'Linux_System' 카테고리의 다른 글

[Linux]ZFS  (0) 2023.01.16
[Linux]PAM  (0) 2023.01.12
[Linux]Process(1)_ps  (0) 2022.11.05
[Linux]Software_Compile  (0) 2022.10.31
[Linux]YUM_LocalRepository  (0) 2022.10.26

PS(Process Status)

프로세스는 실행 중인 프로그램을 나타내는 추상적인 개념으로, 

예를 들어 사용자가 HDD(Non-Volatile Memory)와 같은 저장장치에 있는 프로그램을 실행하게 되면

프로그램이 프로세스 상태로 메모리에 적재되어 실행되며, 모든 프로세스는 부모 프로세스, 자식 프로세스로 분류되게 된다. 

리눅스에서는 init(~CentOS6), systemd(CentOS7~)와 같은 시스템 최초의 프로세스로 "시스템 초기화 프로세스"라고 불린다. 

프로세스 상태 조회에 자주 사용되는 명령어 'ps'를 알아보자

 

 

■ 명령어 'ps'의 활용방식

아무런 옵션 없이 사용하게 되면 현재 사용자의 화면에 표기되는 프로세스에 관해서만 보임

 

▼ 주로 사용되는 옵션은 코드블럭을 참조

ps -f '''현재 실행되는 프로세스에 관해 자세히 출력'''
ps -a '''다른 사용자의 프로세스까지 함께 출력'''
ps -u '''해당 프로세스를 실행중인 사용자의 정보와 시간을 함께 출력'''
ps -x '''백그라운드 프로세스까지 출력'''

ps -aux '''리소스 사용률을 기반으로 프로세스의 상태를 확인'''
ps -ef '''실행중인 모든 프로세스의 상속관계를 기반으로 자세히 확인'''

 

명령어 'ps'에 옵션 '-aux'를 함께 사용

해당 출력내용의 상단부를 보면 필드별로 나누어진 모습을 볼 수 있는데,

 

- USER : 프로세스의 소유자

- PID(Process ID) : 프로세스의 번호

- %CPU : 프로세스가 CPU를 차지하는 비율

- %MEM : 프로세스가 메모리를 점유하는 비율

- VSZ(Virtual Set siZe) : 프로세스에 할당된 가상 메모리의 크기

- RSS(Resident Set Size) : 프로세스가 현재 사용하는 메모리 비율

- STAT : 프로세스의 상태

- START : 프로세스가 시작된 시간

- TIME : 프로세스의 총 실행 시간

- COMMAND : 프로세스를 실행시킨 명령

 

 

 ▶ 프로세스의 상태(status)를 알려주는 필드 'STAT' 값의 의미

 

- R(Run/Runable) : 프로세스가 실행중 또는 실행가능

- D(in Disk wait) : 입출력이 완료될 때까지 깨울 수 없는 상태(수면상태)

-  S(Sleeping) : 대기 중, 수면상태(전환 가능한 상태)

- T(sTopped) : 외부 시그널로 인해 일시 정지된 상태

- Z(Zombie) : 부모 프로세스가 종료 시그널을 정상적으로 수신 못해, 수습되지 않고 남은 상태 

- < : 우선순위가 높은 프로세스

- N : 우선순위가 낮은 프로세스

- I(Idle) : 유휴(쉬고있는) 프로세스

 

명령어 'ps'에 옵션 '-ef'를 함께 사용

'-aux' 옵션을 사용했을 때와는 필드에 중복되지 않는 새로운 정보가 표기되는 것을 확인할 수 있다.

 

- PPID(Parent Process ID) : 부모 프로세스의 ID

- C : 프로레스의 CPU 점유 상태

- STIME : 프로세스가 시작된 시간

- TTY(TeleTYpewriter) : 프로세스가 실행되고 있는 콘솔

 

등을 확인할 수 있다.

 

 

'Linux_System' 카테고리의 다른 글

[Linux]PAM  (0) 2023.01.12
[Linux]Process(2)_top  (0) 2022.11.08
[Linux]Software_Compile  (0) 2022.10.31
[Linux]YUM_LocalRepository  (0) 2022.10.26
[Linux]Basic_Command(2)  (0) 2022.10.10

프로그램 수동 설치 (Source Compile)

소프트웨어 컴파일이란, 프로그램을 설치할 때 환경변수를 주면서 설치하는 경우이다.

풀어서 얘기하면 소스파일(Source File)직접 컴파일 하여 프로그램을 설치,

일반적으로 패키지 매니저로 프로그램을 설치하게 되면 기본설정(Default)으로 설치가 진행되지만,

환경변수를 주며 설치하면 목적(환경)에 맞는 설치를 진행할 수 있다.

 

소프트웨어 컴파일을 활용하는 대표적인 예시로

APM(Apache Web Server + PHP Web Programming Language + MySQL Database)을

상호 연동하여 설치한다면 소프트웨어 컴파일로 설치해야 한다.

 

 

● 소프트웨어 컴파일의 순서

./Configure(환경설정) make(사용자 프로그램을 기계어로 변환) → make install(컴퓨터에 프로그램을 설치)

순으로 과정이 진행된다. 

 

 

● Source Compile 실습

'yum list installed' 명령어를 이용해 컴파일러와 설치될 프로그램과 연계시킬 'httpd' 패키지 설치의 유무를 확인

 

wget http://www.dest-unreach.org/socat/download/Archive/socat-1.4.2.0.tar.gz
### download tarball source

** ~.tar.xx / ~.tar 형식 파일의 경우 TAR(Tape ARchiver) 프로그램으로, 

묶여있거나 압축이 된 파일들을 의미한다.

일반적으로 이런 형식의 파일들을 "tarball source" 라고 칭한다.

 

 

외부에서 다운받은 tarball source를 압축해제

** 대부분 배포하려는 파일을 압축할 때에는 압축효율이 가장 좋은 '~.gz' 방식을 사용한다.

'unzip'의 경우 디폴트 설치가 되어있지 않은 리눅스 배포판이 존재하니 확인 후 사용할 것

 

 

▼ 명령어를 이용하여 tarball source를 압축해제 (해당 소스파일의 경우 tar.gz)

tar xvfz ~.tar.gz   # ~.gz 파일의 압축해제 옵션 'z'
tar xvfj ~.tar.bz   # ~.bz 파일의 압축해제 옵션 'j'
unzip ~.zip         # ~.zip 파일의 압축해제 명령어 'unzip'

 

 

압축해제 후 생성된 socat-1.4 디렉토리로 작업 경로를 이동

어느 프로그램을 다운받은 후(압축을 풀고), 보았을 때 configure 파일이 있으면 컴파일하여 설치하라는 의미이고

해당 파일에 대한 정보나 사용법 등이 궁금하면 해당 파일에 있는 README 파일을 읽어보면 된다.

 

** configure 시 사용 가능한 옵션 등을 확인하고 싶은 경우에는 ./configure --help 옵션을 활용하여 

확인해볼 수 있다.

 

** 기본 설정값으로 설치를 진행하고자 한다면, 옵션을 사용하지 않고 ./configure 만 실행해주면 된다.

 

./configure --prefix=/usr/local/apache --enable-ssh --disable-ipv6

● prefix=/usr/local/apache = 연계를 맺을 대상 프로그램을 지정

● --enable-ssh = SSH 접속을 허용할 것

disable-ipv6 = IPv6는 사용하지 않을 것

 

등 간략하게 정책을 설정 해주었다.

 

'make'와 'make install'을 정규표현식을 활용해 동시에 진행

"기계어로 변환시킨 후에 프로그램을 설치해라" 를 한 줄에 입력하여 다중명령을 사용한 예시인데,

; 의 경우 첫 번쨰 명령이 실패해도 두 번째 명령어로 넘어가서 실행되기 때문에

&& 를 사용하는 것을 추천(첫 번째 명령어 실패 시 두 번째 명령어는 실행 X)

 

 

컴파일 하여 설치된 프로그램이 정상적으로 설치 된 것을 확인

 

'Linux_System' 카테고리의 다른 글

[Linux]Process(2)_top  (0) 2022.11.08
[Linux]Process(1)_ps  (0) 2022.11.05
[Linux]YUM_LocalRepository  (0) 2022.10.26
[Linux]Basic_Command(2)  (0) 2022.10.10
[Linux]Basic_Command(1)  (0) 2022.10.06

+ Recent posts