Post

Linux 스토리지 보안(3)

Linux 스토리지 보안(3)

파일 시스템

파일의 구조

  • 아래는 inode 방식의 파일 구조이다.
1
2
3
4
5
6
7
FILE NAME
+------+
| inode |  <= inode 넘버파일 네임, 퍼미션, 등등이 들어가 있음
+------+	<= -,d,l ...
|  data | 
| block |
+------+

LVM(Logical Volume Manager)

  • 일반적인 논리 볼륨 기술(Logical Volume Technology)
    • LVM(Logical Volume Manager)
    • RAID(Redudant Array Inexpensive Disk)
  • 연결 방법 : DAS, NAS, SAN
    • DAS : 직접 연결 저장 장치
      • Internal DAS : 내장 디스크
      • External DAS : 외장 디스크
    • NAS : 네트워크에 접속되도록 특화된 파일 서버
    • SAN : 스토리지 전용 네트워크(대규모)
      • extarnal DAS 확장
  • 저장 방식 : File, Block, Object based storage

  • 일반적인 논리 볼륨 방식 장점:
    1. 확장성
    2. 안정성
    3. 편의성(관리 용이)
  • LVM 논리 볼륨(Logical Volume) 장점
  • 유연한 용량논리 볼륨을 사용할 때, 디스크 및 파티션을 단일 논리 볼륨으로 모을 수 있으므로 파일시스템을 여러 디스크에 걸쳐 늘릴 수 있다.
  • 크기조정 가능한 스토리지 풀기본 디스크 장치를 다시 포맷하거나 파티션하지 않고 간단한 소프트웨어 명령으로 논리 볼륨 크기를 늘이거나 줄일 수 있다.
  • 온라인 데이터 재배치보다 새롭고 빠른 장애 복구형 스토리지 하부 시스템을 배치하기 위해 시스템 활성화 되어 있는 동안 데이터를 옮길수 있다. 디스크가 사용되고 있는 동안 데이터를 디스크에 재배치 할 수 있다.
  • 편의에 따라 장치 이름 지정논리 스토리지 볼륨은 사용자 정의 그룹에서 관리되며, 편의에 따라 이름을 지정할 수 있다.
  • 디스크 스트라이핑(Disk Stripe)두 개 이상의 디스크에 걸쳐 데이터를 스트라이핑하는 논리 볼륨을 생성 할 수 있다. 이는 데이터 처리량을 급격히 상승 시킬수 있다.
  • 미러 볼륨(Mirror Volume)논리 볼륨은 편리한 방법으로 데이터에 미러를 설정하게 한다.
  • 볼륨 스냅샷(Volume Snapshot)논리 볼륨을 사용하여, 지속적인 백업을 위해 장치 스냅샷을 찍거나 또는 실제 데이터에 영향을 미치지 않고 변경 효과를 테스트할 수 있다.

  • LVM 개념/용어 설명

    1. PV(Physical Volume) - PE(Physical Extend) 물리적 공간

    2. VG(Volume Group) 논리적 공간을 생성하기 위한 공간

    3. LV(Logical Volume) - LE(Logical Extend)

      • 운영 중 공간이 부족할 경우 볼륨그룹에 속해 있는 또 다른 물리볼륨을 사용하여 확장이 가능하고, 필요하다면 크기를 변경하거나 다른 디스크로 데이터를 옮길 수 있다.
      • Volume Group vg00에 속한 Logical Volume lvol1,lvol2,lvol3은 각각 /stand, primary swap, / 디렉토리로 변경이 불가능 하다.
  • LVM 작동 원리
    • Linear 볼륨(LE:PE = 1:1, linear 방식으로 저장)
      • 내부적으로 각 PE는 LE와 1:1 방식이며 여러장의 PV에 데이터가 걸쳐 있지 않고, 하나의 볼륨에 하나의 논리 볼륨이 매핑되는 방식이다.
      • (예) lvcreate -L 1G -n lv1 vg1  
    • Striping 볼륨(LE:PE = 1:1, stripe 방식으로 저장)
      • 여러개의 물리 볼륨에 걸쳐서 논리 볼륨을 구성하는 경우이며, 내부적으로 각 PE와 LE는 1:1 방식이며, 여러장의 PV에 걸쳐서 데이터를 거장하는 방식이다. 이 방식은 LV 생성시 -i 옵션을 사용하여 구성한다.
      • (예) lvcreate -L 1G -n lv1 -i 3 vg1
    • Mirroring 볼륨(LE:PE = 1:2/3/4/5, mirror 방식으로 저장)
      • 미러링된 논리 볼륨의 경우, 단일 또는 이중 미러링을 사용하는지에 따라 각 LE는 두 개 또는 세 개의 PE와 매핑된다. 예를 들어, 미러 사본이 하나인 경우에는 각 LE가 두 개의 PE에 매핑되는데 하나의 확장 영역은 원본에 대한 것이고 다른 하나는 미러 사본에 대한 것이다.
      • 미러링은 사본인 PV를 갖는 형태인데, 에러가 날 경우 사본 PV를 가지고 복구를 진행한다.
      • (예) lvcreate -L 1G -n lv1 -m 1 vg1 (two-way mirror)
  • 명령어들 1) 용량 늘리는 경우 - lvextend -L 1G /dev/vg1/lv1 - resize2fs <-xfs_growfs : xfs 혹은 resize2fs : ext4

    2) VG에 PV를 추가하는 경우(VG의 남는 공간이 늘어나게 됨) - vgextend vg1 /dev/sdf1 - 후 1번 하기

    3) LV 용량 감소(ext4만 가능함) - 용량을 줄일 공간에 대해 umount - fsck -f /dev/vg1/lv1 - 파일 시스템 용량을 줄이고 lv용량을 줄인다. (무조건 순서가 중요함)(따라서 복원 할 수 있게 백업이나 스냅샷이 필요함) - resize2fs /dev/vg1/lv1 2G - lvreduce -L 2G /dev/vg1/lv1

    1
    2
    3
    
      - mount /lv1
      - lvextend -l +100%FREE /dev/vg1/lv2
      - resizefs /dev/vg1/vg2
    

    4) VG안의 PV를 새로 교체 - fdisk /dev/sdg (파티션 만들기) - pv 생성 - vgextend vg1 /dev/sdg1 - pvmove /sdev/sdf1 /dev/sdg1 :: pv를 sdf1에서 sdg1로 바꿈 - vgreduce /dev/sdf1 :: sdf1 삭제 - - linear : 암것도 안씀 - stripe : -i » 얼마나 연결할지 - mirror : -m » 추가할 mirror 카피 개수

((네트워크, 서버, 스토리지)), 서비스 가상화를 진행시키면 클라우드가 됨
↳ 이 세 개가 밑바탕

Object based storage 하나의 스토리지가 아닌 별개의 스토리지를 묶어서 제공

RAID

  • RAID
    • 여러 디스크를 한의 디스크처럼 사용할 수 있도록 하면서 동시에 신뢰성을 높이고 성능을 향상 시킬 수 있는 장치를 뜻한다.
  • Raid 종류
    • Firmware RAID
      • Disk 단위, Firmware 에서 지원, 일반 서버 보드에 RAID chip 내장
    • H/W raid : 안정성 ↑ 가격 ↑
      • Disk 단위, Riad Adapter Firmware에서 지원
    • S/W raid : 신뢰성/속도 ↓ 가격 ↓
      • 파티션 단위, OS에서 지원
  • RAID 구성 방법의 종류
    • raid 0
      • 일반적으로 2개 이상의 하드를 병렬로 연결해서 분산해서 읽고 쓰는 방식(다다익선)
      • 한개의 하드라도 고장 날 경우 완전 고장
      • Linear, Stripe
    • raid 1
      • 데이터의 안전성을 높이기 위해 동일한 데이터를 가진 적어도 두개의 드라이브로 구성
      • 하드 한 쪽이 망가져도 동일한 데이터가 저장된 다른 하드가 살아있다면 복구 가능
      • Mirroring
    • raid 0 + 1
      • RAID 0과 1을 혼합한 방식으로, 레이드 0으로 묶은 하드를 최종적으로 레이드 1로 구성.
      • 즉, 디스크 사용량이 절반밖에 되지 않지만, 안정성이 있음.
    • raid 1 + 0
      • RAID 0과 1을 혼합한 방식으로 레이드 1로 묶은 하드를 최종적으로 레이드 0으로 구성
      • 운영에는 raid 0 + 1보다 더 유리
    • raid 2
      • 스트라이핑 방식이지만 Hamming Code를 사용하고 있는 것이 특징이다. (ECC을 별도의 드라이브에 저장하는 방식)
      • 현재는 모든 현행 드라이브들이 ECC를 탑재하여 거의 사용되지 않음
    • raid 3
      • raid 3과 4는 거의 같다.
    • raid 4
    • raid 5
    • raid 6
    • raid 7
    • raid 53
    • JBOD

저장방식 file-baste storage block based storage 사용자가 올 때 디스크로 몰림 object-based storage

mdam –create(== C) 생성할 logical 장치 이름 –level=(레이드 번호) –raid-device=(구성 디스크 수) madam -C 생성할 lv -l number -n much

madam –detail –scan : 전체 레이드 정보 나옴

mdadm –stop /dev/md0 == mdadm -S /dev/md0 == 삭제

optional superblock 삭제 (md superblock 작업을 수행해야 리부트 해도 정보가 따라 올라오지 않음

raid 0 구성 방법 최소 2장의 디스크가 필요함 fdisk /dev/sdc/ fidsk /dev/sdd mdadm –create /dev/md0 –raid-level=0 –raid-device=2 /dev/sdc1 /dev/sdd1 mdadm –detail –scan > /etc/mdadm.conf

mkfs.ext4 /dev/md0

mkdir -p /raid0 vim /etc/fstab mount /raid0 —————– cd ; umount /raid0 vi /etc/fstab mdadm –stop /dev/md0 mdadm –zero-superblock /dev/sdc1 /dev/sdd1 rm -f /etc/mdadm.conf

raid 1 구성 방법

fdisk /dev/sdc/ fidsk /dev/sdd mdadm –create /dev/md0 –level=1 –raid-device=2 /dev/sdc1 /dev/sdd1 mdadm –detail –scan > /etc/mdadm.conf

mkfs.xfs /dev/md0 mkdir -p /raid1 vim /etc/fstab mount /raid1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
cd ; umount /raid1
vi /etc/fstab
mdadm --stop /dev/md0
mdadm --zero-superblock /dev/sdc1 /dev/sdd1
rm -f /etc/mdadm.conf (일부 삭제는 vim 편집기로)

raid 5 구성 방법
mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdc1 /dev/sdd1 /dev/sde1
mdadm --detail --scan > /etc/mdadm.conf
cat /etc/mdadm.conf
mkfs.ext4 /dev/md0
lsblk --fs
mkdir -p /raid5
vim /etc/fstab
mount /dev/md0 /raid5
df -h

cd ; umount /raid5
vim /etc/fstab
mdadm --stop /dev/md0
mdadm --zero-superblock /dev/sdc1 /dev/sdd1 /dev/sde1
rm -f /etc/mdadm.conf

장애 디스크 교체 과정 raid1 / raid 5로 구성되어 있어야함 rebuild에는 모든 디스크를 읽어드려야 해서 부하량이 많이 걸림

raid 작업 보고서 장애 디스크 교체 작업 상태 확인 r0 : 안해도 됨 (보고서로 제출할 필요는 없음) r1(one mirror) r5(revealed) 증상(log), 원인, 문제 해결

파일 이름 : 이름_RAID 작업보고서_2024_0205.pdf

swap = paging(Window) 디스크내에 존재하는 가상 메모리공간(디스크를 사용) 확인 방법 : cat /proc/swaps ( == swapon -s)

swap 정리 swap ? swap Issue?

  • 언제 스왑을 추가하는가? *메모리가 80%이상 찼을 때
  • 스왑 공간 추가 *(os 설치시) *운영시 : 메모리와 비슷하게 줘야함/3배 이상 늘리지 않음
  • 스왑 추가 시성능 향상? / 좋아지지 않음 운영체제의 멈춤을 막기 위해 멈추지 말라고 집어넣는 것임

software 관리

  1. rpm CMD rpm을 통해 패키지 관리 rpm 명령어

    rpm -ivh ( -i == install) 이전의 패키지 삭제를 하지 않고 새 버전 설치 rpm -Fvh ( -F == freshen) 이전의 패키지가 있을 경우만 해당 패키지 업데이트 ** > rpm -Uvh (U = upgrade) 이전의 패키지가 있으면 업데이트, 없으면 설치 ** rpm -e : 삭제

    –nodeps : 의존성 체크 안함, 의존성 규제를 무시하고 설치/삭제 –force : 패키지 충돌이 발생해도 강제 설치/삭제 -ql 패키지의 파일과 디렉토리 목록 확인 -qf 어떤 패키지의 파일인지 확인 가능(파일한테 적용) -qa 패키지 모두 보기 -p 지정된 패키지의 정보 확인 -qi 패키지의 자세한 정보 확인 rpm -e rpm -qi PKG(설치된거 확인) rpm -qi -p 설치 안되도 .rpm 파일 확인

  2. yum/dnf CMD DNF : 향상된 yum 8.x 부터는 yum = DNF yum -y update php = rpm -Fvh yum -y install php = rpm -Uvh yum list installed <패키지 이름=""> : 설치된 패키지 이름 yum list available <패키지 이름=""> : 가능한 패키지 이름 yum localinstall PKG.rpm yum check-update yum search yum provides == rpm -qf yum download == wget yum info bash yum list "*bash*" yum history info yum history undo yum history redo yum history rollback [번호]

gpgcheck를 안해주면 해커들이 악용할 수 잇음 백도어나 악성코드를 외부에서 넣을 수 있기 때문에 내부면 상관없음 repodata밑에서 윰 리스트 사용가능

ftp로 구성되려면 익명 ftp 로 되어야함 인증하고 들어가면 안됨

yum repositroy 관리(/etc/yum.repos.d/.repo) ㄱ) yum config-manager툴을 통해 ㄴ) /etc/yum.repos.d/.repo 파일을 직접 편집하는 경우 name=”이름” baseurl=”~~~~~~~~” enabled=1 ^^ 이 세가지 꼭 들어가야함 /etc/yum.repos.d/*.repo 파일 생성 방법 yum config-manager –add-repo=”url” vi /etc/yum.repos.d/NAME.repo

yum repolist yum repolist all yum install yum-utils (yum-config-manager CMD) yum config-manager –enable epel –enable epel-modular yum-config-manager –disable epel –disable epel-modular

yum group CMD

  • package, group package, **environment group package export LANG=en_US.UTF-8 : 이래야 복사해서 넣기 좋은 형태가 됨 yum group install GPKG yum group update GPKG yum group list yum group list hidden yum group list hidden | egrep -i ‘security|development’ yum group info GPKG yum group remove GPKG

environment group package yum group list hidden yum group install “이름” > 해당 프로그램을 실행시킬 때 필요한 모든 패키지 다운

kernel version 4.18.0-526.el8.x86_64 yum check-update 2>&1

설치 후 reboot > 새로운 kerenl로 들어가기 버전 확인

kernel 이 들어있으면 재부팅 시켜주기

createrepo » repodata 생성] repodata가 어디에 들어있는지가 중요함

  1. source code
  2. Source code 관리 [실습 - httpd source code로 다운받기]
    • filename: httpd.tar.gz
1
2
3
4
5
 mkdir -p /tools && cd /tools
 wget http://httpd.apache.org/download/httpd.tar.gz
 tar xvzf httpd.tar.gz
 cd httpd
 ./configure --prefix=/usr/local/apache2
  • Makefile.ini -> Makefile
  • 내용 : 컴파일 시 필요한 모든 정보 수집(*.h, lib, cmd, …) # make
  • 다중 컴파일(gcc -o test test.c) -> make 안에 많은 컴파일 옵션들이 붙어있다
  • 컴파일 된 파일은 현재 폴더에 존재 # make install
    • /usr/local/apache2/*
    • 파일/폴더 옮기기 개발용서버의 경우 받은 폴더 함부로 지우지 말기 소스형태로 설치한 프로그램은 rpm 명령어로 확인이 불가능 디렉토리 삭제 후 다시 만들고 싶다면, make install 로 다시 부활가능 아예 삭제 하고 싣싶다면 다운받은 폴더로 들어가서 make clean을 하면 된다

소스코드 패키지화 GPG key 만들기 : gpg –gen-key key id : 28EC9D65EC671CDB650051A044AA47C599D3ED50 ———- 부팅과정과 트러블 슈팅 부팅과정을 잘 이해해야함

    1. F/W 단계 종류 : BIOS, UEFI 주 내용 : 1) POST(power on self test) 2) BOOT DEVICE 선택 3) BOOT LOADER 로딩 | 2. Bootloader 단계 1) LILO(잘 안씀) / GRUB(범용) 2) /boot/grub2/brub.cfg 3) /etc/grub.d/* –> grub2-mkconifg CMD –> /boot/grub2/grub.cfg /etc/default/grub 4) Boot Loader 주 내용 kernel 메모리에 로딩 (/boot/vmlinuz) initramfs 메모리 적제(/boot/initramfs) | 3. 커널 단계 kernel(/boot/vmliuz) kernel 주 설정 파일 : /etc/sysctl.conf, /etc/sysctl.d/ kernel 단계의 주 내용
      • kernel » systemd
    1. systemd 단계 1) systemd daemon ( 특성 : 부팅 시에 서비스 의존성 관계를 가지고 다중으로 서비스를 가동한다) systemd 체계로 7버전부터 바뀌었다. systemd daemon = PID 1 (모든 프로세스의 부모 프로세스) systemd(/etc/system/)는 서비스 유닛 의존성 관계를 가지고 ㅏㄷ중으로 UNIT을 실행한다 2) UNIT(우리가 생각하는 서비스 ex. web, mail etc.) systemd가 관리하는 다양한 개체 유형(확인은 systemctl -t service|target|socket) .service(유닛), .socket, .target(유닛의 모음) 3) systemctl CMD systemctl -t socket (.socket 형태의 것들 중 active인 것만 보여주기) ( -a option : active/inactive 모두) systemctl list-unit-files(시스템 안에 있는 전체 유닛 볼 때) systemctl status : 현재 상태 systemctl is-enabled == systemctl list-unit-files | grep ** : 부팅시 상태 systemctl is-failed httpd == systemctl –failed httpd == systemctl list-jobs : 장애처리 때 쓰임 systemctl start/stop/restart (restart를 선호 : 안 떠있으면 띄우고 더 있으면 재기동) 4) 서비스의 의존성 basic.target + UNIT –> multi-user.target + UNIT –> graphical.target A.service(전) ↓systemctl list-dependencies sshd.service ↓systemctl list-dependencies --reverse C.service(후) 5) 서비스 마스크(자주 안씀) network script vs NetworkManager sendmail vs postfix iptables vs firewalld ntpd vs chronyd 6) 대상 graphical.target mutli-user.target rescue.target who -r systemctl get-default systemctl set-default multi-user.target systemctl isolate multi-user.target

리눅스 부팅 단계

  1. f/w
  2. boot loader
  3. kernel
  4. systemd

    rd.break : 루트 암호 변경(sysroot chroot 해주기) 상태 : root가 피벗 전 상태(/sysroot(ro)) / systemd 실행X, /etc/fstab 안읽음 GRUB에서 아무거나 선택한후 리눅스 라인으로 이동한후 맨뒤로 가서 rd.break 추가 mount -o remount,rw /sysroot chroot /sysroot #장애처리 passwd root ; touch /.autorelabel # exit ; exit init=/bin/bash 상태 : root가 피벗 된 상태(/sysroot,ro), /etc/fstab 안 읽음 GRUB에서 아무거나 선택한후 리눅스 라인으로 이동한후 맨뒤로 가서 init=/bin/bash 추가 mount -o remount,rw /sysroot exit systemd=emergency.target 상태 : 피벗된 상태(ro) systemd 실행 O /etc/fastb 안 읽음 , sulogin prompt GRUB에서 아무거나 선택한후 리눅스 라인으로 이동한후 맨뒤로 가서 systemd=emergency.target 추가 #mount -o remount,rw / vim /etc/fstab exit systemd=rescue.target 상태 : 피벗된 상태(/rw), systemd 실행 O, /etc/fstab 파일 읽어들인상태(rw), sulogin prompt GRUB에서 아무거나 선택한후 리눅스 라인으로 이동한후 맨뒤로 가서 systemd=rescue.target 추가 장애처리(# vi /etc/fstab) # exit
    sysroot 에 디스크가 마운트 /etc/fstab도 읽지 않음 sysroot 잘 알아두기 export LANG=en_US.UTF-8

    sulogin : df명령어가 되면

  5. 트러블 슈팅 systemd 단계 » /etc/rc.local(/etc/rc.d/rc.local) /etc/rc.d/rc.local 부팅시 스크립트 실행하게 하는 거 vi /root/bin/script.sh ; chmod 700 /root/bin/script.sh vi /etc/rc.local ; chmod +x /etc/rc.local

GRUB메뉴를 사용하여 암호를 누구나 변경할 수 있으므로 GRUB 암호를 설정하는 것을 추천함 grub2-setpassword 암호 지우기 : rm -rf /boot/grub2/user.cfg

나중에 실행할 때 systemctl을 통해 단일 체계로 넣고 싶다면 운영체계로 넣으면 됨 작업 절차 1) /usr/lib/systemd/system/새로운 서비스

execstart : systemctl start new wantedBy : 파일을 만들때 링크를 어디에 둘지 심볼릭 링크로 정해두기

지울 때 systemctl stop new systemctl disable new rm -f /usr/lib/systemd/system/new.service systemctl daemon-reload

2) systemctl daemon-reload 주의 사항 : 같은 포트를 쓰면 충돌 나기 때문에 복원 작업까지 해줘야함

This post is licensed under CC BY 4.0 by the author.