Infra/linux

만화로 배우는 리눅스 시스템 관리 3권

미니문92 2022. 2. 2. 17:52

1화 고정 IP 주소를 할당하고 싶어

- IP주소를 고정하는 전통적인 설정 방법

데비안 계열(ubuntu 등) : /etc/network

auto lo
iface lo inet loopback
#ip 자동 할당
#auto eth0
#iface eth0 inet dhcp

auto eth0 → 컴퓨터 부팅시 eth0 자동 유효화
iface eth0 inet static → eth0에 고정 ip주소 할당 명시
address 192.168.20.100 → 고정 ip주소
netmask 255.255.255.0 → 서브넷 마스크
gateway 192.168.20.1 → 게이트웨이

# 설정 후
(sudo) ifdown eth0
(sudo) ifup eth0

레드헷 계열(페도라, CentOS 등) : /etc/sysconfig/network-scrips/ifcfg-(인터페이스명)

TYPE=Ethernet
#DEVICE=eth0
#BOOTPROTO="dhcp"
#IPV6INIT="yes" 
#IPV6_AUTOCONF="yes"
#"NM_CONTROLLED="yes"

DEVICE=eth0 
ONBOOT=yes # 컴퓨터 부팅시 eth0 자동 유효화
BOOTPROTO=none # eth0에 고정 ip주소 할당 명시
IPADDR=192.168.20.101 # 고정 ip주소
NETMASK=255.255.255.0 # 서브넷 마스크
GATEWAY=192.168.20.1 # 게이트웨이

# 설정 후
ifdown eth0
ifup eth0

nmcli(Network Manager Command Line Interface) 사용 가능


2화 특정 포트에만 접속 허가하고 싶어

- ufw를 사용한 방화벽 설정

리눅스는 포트 번호마다 접속 허가,금지가 가능하고 리눅스는 ufw 명령어로 설정 가능

sudo ufw status
sudo ufw default deny
sudo ufw allow 80
sudo ufw allow 22
sudo ufw enable

3화 CentOS 6 이전 버전에서 특정 포트에만 접속 허가하고 싶어

- iptables를 사용한 방화벽 설정

su
iptables --table filter --flush # 필터 설정을 대상으로 전부 삭제
iptables --policy INPUT DROP # 다른 컴퓨터에서 이 컴퓨터로 들어오는 통신 차단
iptables --policy OUTPUT ACCEPT # 다른 컴퓨터로 나가는 통신 허가
iptables --policy FORWARD ACCEPT # 다른 컴퓨터에서 또 다른 컴퓨터를 향한 통신 "중계" 허가
iptables --append INPUT --protocol tcp --match status --state NEW --dport 22 --jump ACCEPT
iptables --append INPUT --protocol tcp --match status --state NEW --dport 80 --jump ACCEPT
#특정 인터페이스를 향한 통신 관련 필터를 반영하는 지정, lo는 loopback
iptables --append INPUT --in-interface lo --jump ACCEPT
#통신을 확립했따는걸 나타내는 응답과 관련된 통신 허가
iptables --append INPUT --match state --state ESTABLISHED,RELATED --jump ACCEPT
#ping 확인용 통신 허가
iptables --append INPUT --protocol icmp --jump ACCEPT
service iptables save

--append INPUT : INPUT 통신설정 추가

--protocol tcp : 통신종류 TCP

--dport 00 : 00포트를 향해

--jump ACCEPT : ACCEPT 페이지 참고


4화 네트워크 세그먼트 단위로 접속 허가/차단하고 싶어

- 접속 상대에 따라 통신 허가, 차단을 판단하는 방화벽 설정

# ufw
sudo ufw allow from 192.168.20.0/24 to any port 80

# iptables
iptables --append INPUT --protocol tcp --match state --state NEW
           --source 192.168.20.0/24
           --dport 80 --jump ACCEPT

5화 직접 접속할 수 없는 네트워크에 있는 컴퓨터로 인증하고 싶어

- 에이전트 전송을 사용한 ssh로 공개키 인증

ssh -A 192.168.1.10


6화 중간 서버 뒤에 있는 서버에 직접 파일을 복사하고 싶어

- ssh로 포트 전송 : 로컬 전송 기초(port forwarding)

중간서버 192.168.1.10
복사 대상 서버 : 192.168.2.20

터널 작성
ssh youngminmun@192.168.1.10 -L 50022:192.168.2.20

터널 사용
scp -P 50022: /home/youngminmun/example.txt admin@localhost:/tmp/


7화 특정 네트워크 세그먼트용 웹서버에 다른 세그먼트에서 접속하고 싶어

- ssh로 포트 전송 : 로컬 전송 응용

중간서버 192.168.40.10
대상 서버 192.168.1.100

터널 작성
ssh admin@192.168.40.10 -L 50080:192.168.1.100:80 (-g 옵션 : 터널 입구가 다른 컴퓨터에도 개방)
다른 방법
ssh admin@192.168.1.100 -L 50080:localhost:80 (192.168.1.100 대상 서버로 ssh 접속이 가능한 경우에만)

접속(기존 /fronnt)
http://localhost:50080/front


8화 터널링용 ssh 접속을 자동으로 복구하고 싶어

- autossh로 자동 재접속

터널링용 ssh 접속이 갑자기 끊겼을 때 자동으로 접속을 회복하고 싶을 때 ssh 대신autossh 사용

autossh admin@192.168.1.100 -L 50080:localhost:80


9화 누가 그 포트 번호를 사용하고 있는지 알고 싶어

- lsof, 서비스명으로 포트 번호 특정

sudo lsof -i :<포트번호>
sudo lsof -p <프로세스 ID> -P(대문자) | grep LISTEN

  • -i : internet address, 포트를 사용하는 프로세스ID
  • -p : 특정 프로세스가 사용하는 포트번호

lsof -i4 TCP@10.12.135.10:3000

서비스 관리용 명령어

  •  systemctl stop <서비스명>.service
  • service <서비스명> stop
  • /etc/init.d/<서비스명> stop

서비스 상태 확인 명령어

  • service ssh status
  • service --status-all

10화 누가 네트워크 대역을 사용하고 있는지 알고 싶어

- nethogs,iftop

  • 어떤 프로세스에서 통신량이 많은지?
  • 어떤 상대와 통신량이 많은지?

nethogs : 통신량 많은 순서대로 목록 표시 / 프로세스별 총 통신량

iftop : interface top, 네트워크 인터페이스 사용 상태를 감시해서 통신상대 컴퓨터마다 통신량을 조사


11화 다른 네트워크에서 자기 PC로 로그인되게 하고 싶어

- ssh로 포트 전송: 리모트 전송

mid-server IP : 10.13.3.30
사외지역 기기 IP : 10.13.0.10
사외지역 내 PC IP : 10.13.0.20

사외지역에서 mid-server로는 접속할 수 있는 상황이어야함

리모트 포트포워딩
"-R 입구 포트:도착 대상 컴퓨터:도착 대상 포트"
ssh mid-server -R 50022:10.13.0.10:22

터널 사용(사내에서)
ssh -p 50022 user@localhost


12화 여러 컴퓨터에 있는 파일 중에서 가장 최신 파일을 모으고 싶어

- rsync, 편리한 scp처럼 사용하는 방법

rsync : remote synchronize

rsync <option> <복사 원본 경로> <복사 대상 경로>

  • -r(--recursive) 디렉토리 전체
  • -t(--times) 복사 후 파일 최종 갱신일자를 복사 원본과 같아지도록(거의 필수 옵션)
  • -u(--update) 새로운 쪽을 우선함

직접 통신 불가능한 컴퓨터끼리 rsync도 가능
rsync -rtu --rsh='ssh -p <포트번호>' ~/home/youngminmun/ admin@localhost:~/


13화 복사한 후 남아있던 오래된 파일을 삭제하고 싶어

- rsync의 --delete 옵션과 --dry-run 옵션

--delete : 복사 원본에 없고 복사 대상에만 있는 파일을 삭제

--dry-run(-n) : 파일 복사나 삭제 같은 변경을 실제로 하는게 아닌, 결과 확인 조작 가능

-v(--verbose) : 자세히 출력


14화 외부에서 접속 금지 네트워크끼리 통신하고 싶어

- ssh로 포트 전송 : 리모트 전송과 로컬 전송 조합

네트워크 : 전시회장 - 대전지사 - 본사

전시회장 : 10.13.1.0/24
mid-server : 10.13.2.0/24
본사 : 10.13.3.0/24

전시회장 네트워크
ssh youngminmun@mid-server -L 50080:localhost:58080

본사 네트워크
ssh user@mid-server -R 58080:10.13.1.20:80

전시회장에서 접속
http://localhost:50080/wiki

중계서버는 보안대응이 잘되는, 공격자가 침입하기 어려운 서버로 포트포워딩 할 것
리모트 전송 접속은 사용이 끝난뒤 바로 종료할 것


15화 다른 사용자가 소유하는 파일을 서버 사이에 동기화하고 싶어

- 관리자 권한으로 rsync 실행

--archive(-a) : 소유자와 접근 권한 상태 동기화

로컬과 리모트 모두에 rsync가 실행가능해야하고 권한도 관리자 권한이어야함

  • 리모트쪽 서버에 root 로그인(보통 금지되어있음)
  • 리모트쪽 서버에 암호 입력 없이 rsync에만 sudo 실행 가능하게하기
# 리모트 서버에서
sudo visudo
# 다음 두줄 추가
Defaults!/usr/bin/rsync !requiretty
youngminmun ALL=(ALL) NOPASSWD: /usr/bin/rsync --server -logDtpre.iLsfx . /home/
#NOPASSWD 뒷부분은 명령어 실행시 상세정보 출력(-vv옵션) 을 통해 얻은 정보, opening connection using: 뒤에 출력
# 로컬 서버에서
sudo rsync -a --rsync-path='sudo rsync' /home/ youngminmun@10.13.11.110:/home/

16화 ssh 접속 가능한 서버를 안전하게 공개하고 싶어

- sshd 기본 추천 설정

root로 리모트 로그인 금지

sudo vim /etc/ssh/sshd_config
PermitRootLogin no

공개키 인증으로 전환

sudo vim /etc/ssh/sshd_config
#비밀번호 입력으로 로그인 불가능
PasswordAuthentication no
ChallengerResponseAuthentication no

#허가 list
RSAAuthentication yes
PubkeyAuthentication yes

대기 포트 번호 변경하는 방법도 있지만 방화벽설정도 바꿔야함, 번거로우므로 그다지 많이 하지는 않는듯


17화 관리자 권한으로 한 조작 기록을 추적하고 싶어

- sudo 실행 시 인증 로그 조사

인증 로그가 저장되는 장소

  • 데비안 계열 : /var/log/auth.log
  • 레드헷 계열 : /var/log/secure
  • NetBSD,solaris : /var/log/authlog

sudo less /var/log/auth.log + shift+g

zgrep : 압축파일 / 압축 안된파일 구분없이 검색 가능

sudo passwd --lock root 해놓으면 반드시 sudo를 사용해야하고 조작기록이 인증로그에 남는다


18화 성가신 무차별 대입 공격을 차단하고 싶어

- fail2ban으로 통신 차단

fail2ban : 인증 로그에 기록되는 내용 감시

sudo apt install fail2ban
sudo vim /etc/fail2ban/jail.local
# editor
[DEFAULT]
bantime = 86400 # 계속 인증에 실패한 접속을 차단하는 시간. 초단위
ignoreip = 127.0.0.1/8 10.13.1.0/24
# failregax 오른쪽에 있는 검출 규칙 목록에 한줄 추가
# fail2ban 초기 설정은 위협적이지 않은 공격로그은 검출하지 않으므로 그것도 차단하려면 아래 규칙 추가
vim /etc/fail2ban/filter.d/sshd.conf
^%(__prefix_line)sConnection closed by <HOST> \[preauth\]$

sudo systemctl restart fail2ban

sudo fail2ban-client status ssh(혹은 sshd): fail2ban 동작 확인


19화 파일 자체를 비교하지 않아도 같은 파일인지 확인하고 싶어

- md5sum, sha1sum으로 해시 값 계산, eject

$ md5sum a.txt 
$ md5sum b.txt 결과값 비교

md6 < SHA-1 < SHA-256 < SHA-512 순서로 안전


20화 파일이 망가지지 않았는지 변경되지 않았는지 확인하고 싶어

- sha256sum, sha512sum으로 안전한 해시 값, 신뢰할 수 없는 정보, diff

신뢰할 수 없는 데이터(자기가 관리하지 않은 컴퓨터를 한번이라도 경유한 적이 있는 데이터)는 안전한 해시 함수로 검증 : sha256sum, sha512sum

diff --recursive --unified(-ru 가능) first.txt second.txt


21화 비밀 정보를 안전하지 않은 경로로 안전하게 주고받고 싶어

- gpg로 파일 암호화와 복호화

감청되더라도 비밀 정보를 지키는 목적

GPG(GnuPG, GNU Privacy Guard)

apt install gnupg
yum install gpupg
# 공개키를 자신의 키 데이터베이스에 임포트
$ gpg --import /home/youngminmun/pubkey/mym.pgppubkey
$ gpg --encrypt --recipient youngminmun@mail.com example.txt
# 파일 암호화
gpg --gen-key
gpg --export youngminmun@mail.com > /tmp/mym.gpgpubkey
scp guest@10.13.11.30:/tmp/mym.gpgpubkey ~/
gpg --import mym.gpgpubkey
gpg --encrypt --recipient user@mail.com example.txt
scp example.txt.gpg guest@10.13.11.30:/tmp/
# 파일 복호화
gpg --decrpyt /tmp/example.txt.gpg > example.txt 하면 passphrase 입력

22화 관리자 권한이 필요한 조작을 신용하기 어려운 사람에게도 허가하고 싶어

- sudo로 실행 가능한 명령어 제한

$ sudo visudo (/etc/sudoers 파일 수정)
#초기 설정
root ALL=(ALL:ALL) ALL(사용자 root에 주어진 권한 지정)
%sudo ALL=(ALL:ALL) ALL(그룹 sudo에 주어진 권한 지정)

# youngminmun user에게 restart만 가능하게
youngminmun ALL=(ALL) /bin/systemctl restart blocker

sudo 설정 [누가][어떤컴퓨터에서]=([누구로서]) [어떤 조작을 실행]

$ command -v systemctl 입력시 명령어 전체 경로 출력 가능


23화 안전한 암호를 설정하고 싶어

- pwegen으로 암호 생성

pwegen 암호에 어울리는 임의의 문자열 생성

# 15자리 문자열 1개 생성
$ pwg 15 1 

--symbols(-y) : 기호를 포함하여 생성


24화 신뢰할 수 없는 값에도 안전한 스크립트를 만들고 싶어

- 변수값과 명령어 실행 결과의 안전한 참조 방법, 신뢰 경계선과 경계 방어

신뢰 한계선 외부에서 온 내뇨응은 신뢰할 수 없으므로 명령어 일부로 그대로 실행하면 안됨

신뢰할 수 없는 내용을 명령어에 포함시킬 때는 반드시 "큰따옴표"로 감싸기


25화 명령어 이력에 남은 암호를 지우고 싶어

- bash_history에 남은 비밀 정보 삭제

history 명령어 이력

  • -a : history list에 있는 내용을 바로 현재 파일에 추가
  • -c : clear
  • -r : read
  • -d : 메모리에 있는 명령어 이력번호 삭제(설정에 따라서 사용할 수 없거나 무의미한 경우가 있으므로 주의)
# 명령어 이력이 저장된 파일
# vim으로 직접 편집
vim ~/.bash_history

# 지우고 싶은 패턴 특정 가능할 경우 
# sed 사용 : 'password='이 포함된 줄을 삭제
$ sed -e '/password=/d' -i ~/.bash_history 

# grep 사용 : 'password='포함한 줄을 제외
$ cat ~/.bash_history | grep -v 'password=' > ~/.bash_history.tmp
$ mv ~/.bash_history.tmp ~/.bash_history

# 위의 명령어 실행 후
$ history -c # 비밀 정보를 포함한 메모리에 있는 이력 파기
$ history -r # 비밀 정보가 포함되지 않은 수정이 끝난 이력을 원본에서 복사해 옴

'Infra > linux' 카테고리의 다른 글

만화로 배우는 리눅스 시스템 관리 2권  (0) 2021.10.01
리눅스 기본 디렉토리 구조  (0) 2021.08.07
cat <<EOF  (0) 2021.08.07
만화로 배우는 리눅스 시스템 관리 1권  (0) 2021.07.31