Linux(Rocky9)

freshness·2024년 6월 14일
post-thumbnail

실습 도구

  • VirtualBox(설치) - 가상머신 관리도구(=하이퍼바이저), Ver7.0
    • 환경 설정 - 입력 → 가상머신의 호스트 키 조합 → Ctrl + Alt 로 변경(가상머신 화면 / 윈도우화면 커서 제한 변경)
    • 네트워크
      • NAT - 인터넷(가상머신 통신X)
      • NAT NETWORK - 인터넷 + 가상머신 네트워크
      • HostOnly - 가상머신 네트워크 + Host(VirtualBox를 설치한 OS)에서 접속 가능
      • Bridge - 물리적인 네트워크 설정을 가져다 사용할 수 있는 방식
  • Vagrant(설치)
    • IaC(자동화) 도구 중 하나
    • VirtualBox 에서 가상머신을 만들기 위해 사용

Vagrant 명령어

  1. vagrant init - 초기화(샘플 파일 생성 명령어) → Vagrantfile 생성
  2. vagrant up - 파일을 통해 가상머신 생성 및 부팅
  3. vagrant halt - 가상머신 종료
  4. vagrant destroy - 가상머신 제거
  5. vagrant snapshot save - 복구지점 생성
  6. vagrant snapshot restroe - 복구지점 불러오기

가상환경 설치

  1. 가상환경 세팅할 폴더를 생성 후 해당 위치에서 command 열기

  2. vagrant init

  3. Vagrantfile(config) 열기/편집

    # -*- mode: ruby -*-
    # vi: set ft=ruby :
    
    Vagrant.configure("2") do |config|
      config.vm.box = "generic/rocky9" # 이미지 9버전
      # private_network = HostOnly
      config.vm.network "private_network", ip: "192.168.56.100"
    
      config.vm.provider "virtualbox" do |vb|
        vb.memory = "2048"
        vb.cpus = "1"  
      end
      # config.vm.provision "shell", inline: <<-SHELL
    end
  4. vagrant up - Vagrantfile을 참고해 가상머신 생성

  5. vagrant ssh VMNAME - 생성된 가상머신에 접속

  6. 커스텀 shell 설정

    1. bash → zsh(powerlevel10k) + 유용한 플러그인

      Upgrade your Terminal experience with Zsh, Oh My Zsh, and powerlevel10k!

  7. 설정 후 복원지점 생성

    1. vagrant snapshot save <스냅샷 이름> - 현재 지점 스냅샷으로 가상머신 상태 복원 설정
    2. vagrant snapshot restore <스냅샷 이름> - 스냅샷 지점으로 복원
    3. vagrant snapshot list - 저장된 스냅샷 확인

유닉스/리눅스

  1. 특징
    1. 다중 사용자, 멀티태스킹, 높은 이식성, 계층적 파일 시스템
  2. 운영체제 구성요소
    1. 커널
      1. 파일 시스템 관리
      2. 데이터 저장
      3. CPU 제어, 메모리 및 프로세스 관리
      4. 하드웨어 장치 관리
      1. 사용자와 커널 사이의 인터페이스 담당
    2. 디렉토리

CLI 구문

  1. 명령어 구성요소
ls -l /home
  1. 명령어(Command) - ls
  2. 옵션(Option) - -l
    1. 일반적으로 - 문자 뒤에 옵션 지정
    2. 대소문자 구분
  3. 인자값(Argument) - /home
    1. 명령어 실행에 영향을 받는 파일
  4. CLI 제어문
    1. Ctrl + U - 현재 커서 앞 삭제
    2. Ctrl + K - 현재 커서 뒤 삭제
    3. Ctrl + W - 단어 단위로 삭제
  5. 명령어
    1. man - 명령어의 매뉴얼
      1. man <명령어> - 해당 명령어의 매뉴얼을 보여준다.
      2. 매뉴얼에서 / 를 입력 후 검색하고 싶은 내용을 넣은 후 검색 할 수 있다.
        1. 매뉴얼 내 검색어가 여러개가 찾아진 경우 n 을 눌러 다음 검색어로 넘어갈 수 있다.
    2. wc - 파일의 줄/단/문자수 확인 명령어
      1. 대용량의 csv 문서를 열지 않고 줄 수를 볼 수 있어서 유용
      2. 옵션
        1. -l : 줄 개수
        2. -w : 단어 개수
        3. -c : 바이트 개수
        4. -m : 문자 개수
    3. touch - 파일의 시간을 현재 시점으로 지정
      1. 본 기능과는 다르게 파일이 존재하지 않는 경우 파일이 생성되기 때문에 파일 생성 용도로 많이 사용
    4. grep
      1. grep <옵션> <패턴> <파일이름>
      2. 옵션
        1. -i : 대소문자 구분 X
        2. -v : 해당 패턴을 포함하지 않는 결과
        3. -w : 주어진 단어와 정확히 일치하는 결과
        4. -A 2 : 검색 라인 + 검색 라인 아래 라인 2개(After)
        5. -B 2 : 검색 라인 + 검색 라인 위 라인 2개(Before)
        6. -C 2 : 검색 라인 + 위 아래 라인 2개씩
        7. -l : 검색 결과 여부만 확인(별도의 내용 없음)
        8. -r : 하위 계층까지 검색
        9. 패턴을 2개 이상 주려고 할 때
          1. grep -v -e "^#" -e "^$" <파일명>
    5. find
      1. 특정 디렉토리를 기준으로 하위 디렉토리 검
      2. find <경로> <조건> <동작>
        1. find / -name <파일/디렉토리명> - 명칭 검색
        2. find / -name <파일/디렉토리명> -type f - 검색 결과 중 타입 지
          1. f - file, d - directory
        3. find /root -size 10k - 정확한 파일 크기를 검색
          1. find /root -size -1M - 1 MB 이하
          2. find /root -size +1M - 1MB 이상
        4. find /root -name <파일/디렉토리명> -ls - 검색 결과의 경로 및 자세한 정보 표시
        5. find /root -name <파일/디렉토리명> -exec cp {} /home/vagrant \; - 검색 결과 대상에 특정 명령 수행
        6. find /root -name <파일/디렉토리명> -ok cp {} /home/vagrant \; - 검색 결과 대상에 특정 명령을 대화형으로 수행

정규표현식 + 메타문자

  1. 정규표현식 메타문자
    1. ^(a) - (a)으로 시작하는 줄
    2. (a)$ - (a)으로 끝나는 줄
    3. (a).....(b) - a와 b사이 아무 문자 5개로 이루어짐
    4. [a-z]* - 소문자로 시작하는 문자 또는 아무것도 없음
    5. [aA]bcde - abcde 또는 Abcde
    6. [^a-r]bcde - 첫 문자가 a-r 사이를 제외하고 s-z 사이의 문자로 구
    7. [234asdfg] - 대괄호 내 글자 중 하나가 있을
  2. 정규표현식이 문자로 쓰여야 할 때 사용하는 방법
    1. 정규표현식 기호 앞에 백틱(\) 추가
  3. 파일, 디렉토리작업 시 패턴이 보이는 형태는 한번에 작업
    1. touch photo{1,2,3}.jpg, touch movie{1..5}.avi
    2. mv /home/vagrant/movie?.avi movie
    3. mv *.jpg photo
    4. rm movie/{movie1.avi, movie2.avi, movie3.avi}

링크

파일에 쉽게 접근하기 위해 사용

  1. 하드링크
    1. ls -l 두 번째 필드에서 확인할 수 있다.
    2. 특정 파일의 디스크 저장 위치가 동일한 곳을 가리키고 있다.
    3. 하드링크 → Inode → 데이터블록 순서대로 찾아간다.
    4. 파일 링크만 만들 수 있다
    5. 원본이 삭제되어도 사용 가능
    6. ln <원본> <링크파일명> 으로 링크 생성
  2. 심볼릭 링크
    1. 윈도우 바로 가기와 비슷하며 파일 또는 디렉토리 위치만을 가리킨다.
    2. 심볼릭 링크 → 파일 이름 → Inode → 데이터블록 을 찾아간다.
    3. 파일, 디렉토리 모두 링크를 생성할 수 있다
    4. 원본이 삭제되면 파일, 디렉토리를 사용할 수 없다
    5. ln -s <원본> <링크파일/디렉토리명> 으로 링크 생성

Vim

  1. Command 모드(ESC)
  2. Edit 모드(i)
  3. Last Line 모드(:)
    1. <시작라인>, <끝라인> s/bin/abc/g - 문서 내 bin → abc로 변경

권한(Permission)

  1. 필드 -rw-r--r--
    1. 0 : 파일 유형
    2. 1~3 : 소유자
    3. 4~6 : 소유그룹
    4. 7~9 : 유저,그룹을 제외한 다른 유저
  2. 권한 명칭
    1. r - 읽기
    2. w - 쓰기
    3. x - 실행
    4. - - 권한 없음
  3. 사용자 / 그룹 관리
    1. (root) useradd <사용자id> - 아이디 생성
    2. (root) passwd <사용자id> - 패스워드 생성
    3. (root) groupadd <그룹id>
    4. groups <사용자id> - 사용자가 속한 그룹
    5. (root) usermod -g <그룹명> <사용자id> - 특정 사용자에게 그룹 추가
    6. chgrp <그룹명> exam_num - 그룹 변경
    7. (root) chown <사용자id>:<그룹명> <파일명> - 소유자와 그룹 변경
    8. (root) chown <사용자id> <파일명> - 소유자 변경
    9. (root) chown <사용자id>. <파일명> - 사용자와 그룹명이 같은 경우 일괄 변경

쉘 명령어

history - 현재까지 입력된 명령어의 기록

  • history에 순차적인 숫자가 부여된 명령어들이 나열되어 있다, 이 명령어를 사용하려면 커맨드 창에 !<명령어 번호> 를 입력한다.

<명령어> esc + . - 명령어로 입력한 마지막 인자를 불러온다.

Ctrl + u - 현재 줄 모두 지우기

표준 입출력

  • 표준 입력(0-stdin)
  • 표준 출력(1-stdout)
  • 표준 에러(2-stderr)

리다이렉트

> - 표준 출력(stdout=1)을 별도 파일에 저장(write)

  • 출력에 에러가 발생할 경우 파일은 생성되지만 내용은 저장하지 않는다.
  • ls noname 2> error.txt 표준 에러(2)를 입력해 표준 에러에 대해 저장.
  • ls noname fileA &> print.txt - 표준 에러(2)와 표준 출력(1)을 함께 저장

>> - 출력 값을 별도 파일에 추가(append)

ls -l | tee tee.txt - 커맨드 결과를 출력하고 결과값을 파일로 저장

아카이빙

  1. tar - 용량을 압축하지 않는 방식으로 아카이브 파일을 생성

    1. argument
      1. z - gzip 방식으로 압축, 용량이 줄어든다
      2. x - 추출
      3. c - 생성
      4. v - 진행상황 출력
      5. f - 파일 이름지정
      6. t - 확인
      7. J - xzip 방식, 용량을 크게 줄이고 싶을 때 사용
      8. C - 압축 해제 시 압축 해제 디렉토리를 직접 지정
    2. 예시
      1. 압축 - tar -zcvf <파일이름>.tar.gz <압축 대상>
      2. 추출 - tar -zxvf <추출 대상>
      3. xzip 압축 - tar -Jcvf <파일이름>.tar.gz <압축 대상>
    3. tar 아카이브 추출 시 같은 이름의 파일을 물어보지 않고 덮어쓰는데 이 떄문에 압축 시 경로의 맨 앞 / 을 제거 후 저장하고 추출할 때는 압축 파일이 위치한 경로에 압축을 해제한다.

    umask

    유저가 파일, 디렉토리를 생성할 때 기본적인 권한을 주기 위해 설정하는 값으로

    3~4의 숫자로 구성되며 뒷자리 3개가 u/g/o 의 권한을 가리킨다.

    프로세스

    1. 프로세스 - 작업이 실행 중인 프로그램
    2. PID - 프로세스 번호
    3. PPID - 자식프로세스의 추적을 위해 부모 프로세스의 PID를 포함
    4. UID/GID - 소유자, 그룹 아이디
    5. 데몬 프로세스 - 사용자가 아닌 커널에 의해 백그라운드에서 구동
    6. kill / pkill / killall - 프로세스에 시그널을 전달해 작업 수행
      1. kill - PID 기준
      2. pkill - 프로세스 이름 기준
      3. killall - 명령어 기준
    7. nice / renice
      1. 프로세스의 우선 순위를 조절 할 수 있으며 -20 ~ 20 사이의 값으로 구성되어 있다.(값이 낮을 수록 우선순위가 높음)
      2. 일반 유저는 우선순위를 현재 기준에서 낮추는 것은 불가
      3. nice - 실행할 프로세스의 우선 순위 지정
      4. renice - 실행 중인 프로세스의 우선 순위 수정
      5. nice -n -15 sleep 1000 & - -15의 우선순위로 sleep을 백그라운드에서 실행

    사용자 및 그룹 관리

    • 유닉스 계열 OS에서는 사용자/그룹을 통해 시스템/파일 권한 관리
    • OS에서 권한을 판단 시 사용자 이름 → 그룹 순으로 확인
    1. /etc/passwd - 사용자 정보가 담긴 파일
      • 2번째 필드가 !!로 지정된 경우 비밀번호 X
      • 필드 예시 root:x:0:1003:root:/root:/bin/zsh
        번호필드명의미
        1USER사용자
        2x(place holder)패스워드 저장
        3UID유저 ID
        4GID그룹 ID
        5GECOS사용자 주석
        6HOMEHOME 디렉토리 경로
        7SHELL기본 SHELL
    2. /etc/group - 그룹 정보가 담긴 파일
      1. 사용자는 최소 하나의 그룹에 속해야한다.(기본 그룹)

        1. 파일 생성 시 기본 그룹이 파일의 사용자 그룹으로 지정
      2. 기존 유저의 그룹 추가 방법

        1. usermod -g <그룹명> <유저명> - 기본 그룹 변경
        2. usermod -G <그룹명> <유저명> - 보조 그룹 지정
      3. 필드 예시 root:x:0:

        번호필드의미
        1GROUP그룹 이름
        2x그룹 패스워드 저장
        3GIDGID
        4MEMBER해당 그룹을 보조 그룹으로 사용하는 사용자 이름
    3. /etc/shadow
      1. 필드 예시root:$6$rgIgKwI1aJNMJL9U$mwLgcT5HgxfJ/mYdCUTnEwHcwf5YSJ6I.g0n594YHGgZ7V/ytPWmnxdqKbOH1jf5c.VSsva.NYZXF7iSGSos30:19864:0:99999:7:::

        번호필드명의미
        1USER사용자
        2HASH1. $로 구분 시 3개의 구역이 나뉜다.
        1. 1 - 해시 알고리즘
        2. 2 - salt 값을 이용해 암호화 진행
        3. 3 - 해시 패스워드 |
          | 3 | LASTCHANCE | 1970.1.1 기준 패스워드 수정 후 일수를 계산한 값 |
          | 4 | MIN | 1. 패스워드 변경 전 최소사용기간
          0 이라면 언제든지 변경 |
          | 5 | MAX | 패스워드 변경 전 최대사용기간 |
          | 6 | WARNING | 패스워드 사용 만기 전 경고메시지 제공 일 수 |
          | 7 | INACTIVE | 로그인 접속 차단 일 |
          | 8 | EXPIRE | 로그인 사용 금지 일(월/일/연도) |
          | 9 | BLANK | 사용 X |
    4. 사용자 생성 - useradd [option] <userid>
      1. Option

        옵션설명
        -uUID
        -U사용자와 같은 이름의 그룹 생성
        -g기본 그룹 지정
        -G보조 그룹 지정
        -d홈 디렉토리 지정
        -s기본 쉘 지정
        -oUID 중복 허용
        -p패스워드 지정
        -rUID 199 ~ 999인 시스템 계정을 만들 때 사용
        -m홈 디렉토리가 존재하지 않을 경우 생성
        -e/etc/shadow의 EXPIRE 필드 지정
        -f/etc/shadow의 INACTIVE 필드 지정
      2. /etc/default/useradd - useradd 시 기본값을 담은 파일

      3. -p 옵션을 사용해 유저를 생성할 경우 암호화가 되지 않고 /etc/passwd 에 그대로 기록되기 때문에 권장하지 않는다.

      4. /sbin/nologin 을 유저의 shell로 지정할 경우 로그인 할 수 없다.

    5. 사용자 삭제 - userdel -r <사용자id>
      1. -r 옵션 없이 유저 제거 시 삭제된 유저의 홈 디렉토리가 남는다.
    6. 사용자 변경 - usermod <argument> <사용자id>
      1. usermod -aG wheel, 2024 user01
        1. 내용 변경이 기본이며 내용을 추가하고 싶다면 a옵션을 포함해서 써야한다.
      2. usermod -L <userid> 사용자 계정 Lock ↔ -U
    7. 사용자 조회 - id <사용자id>
      1. 사용자의 uid, gid, 보조그룹 정보를 알 수 있다.
    8. 그룹 관리
      1. groupadd - 추가
      2. groupmod - 변경
      3. groupdel - 삭제
      4. argument는 사용자 관련 명령어와 거의 동일
    9. 유저 생성 관련 기본 세팅
      1. 유저 생성 시 default 값 지정 및 변경
        1. /etc/default/useradd
        2. /etc/login.defs
    10. UID
      1. UID 0 - Root
      2. UID 1 ~ 999 - 리눅스 내부 사용
      3. UID 1000 ~ - 일반 유저
    11. 사용자 전환 su (Switch User)
      1. su [option] <userID>
      2. su 사용 시 - 를 사용하지 않고 유저가 변경될 경우 환경 변수나 작업 환경이 변경되지 않기 때문에 - 사용을 권장
    12. 관리자 권한 작업 sudo
      1. root 사용자로 여러명이 작업할 경우 실수나 문제가 발생했을 경우 추적이 어렵다.
      2. 이런 이유로 각 유저는 개인 계정을 사용하고 관리자 권한이 필요한 작업을 sudo를 사용해 작업해 로그 기록을 추적한다.
      3. /etc/sudoer 에 사용자가 등록되어 있어야 sudo 를 사용할 수 있다.
        1. 일반 유저의 sudo 권한 부여 시 /etc/sudoers.d/ 에 사용자 id를 파일 이름으로 한 뒤 <userid> ALL=(ALL) NOPASSWD: ALL 를 입력한다.
        2. NOPASSWD: ALL 는 해당 유저가 sudo 작업 시 비밀번호 요구 여부에 대한 내용이다.
      4. sudo 작업 시 로그인 유저의 패스워드를 사용해 인증한다.
      5. wheel 그룹에 포함된 유저는 sudo 권한을 가지고 있다.
    13. 패스워드
      1. chage - 유저 패스워드 만료 정보 조회 및 변경
        1. chage -l <userid> : 유저 패스워드 정보
    14. 기타 내용
      1. mkdir -m 755 /home/lastuser 처럼 디렉토리 생성 시 권한 설정 가능

고급 권한 관리

  1. 확장 권한 - rwx 외 기능 이외의 확장 권한
    1. setuid - 소유자 권한 중 x가 s로 되어있는 경우(/usb/bin/passwd)

      1. 다른 사용자가 파일을 열 때 소유자의 권한으로 실행
    2. setgid - 소유 그룹 권한 중 x가 s로 되어있는 경우

      1. 다른 사용자가 실행 파일을 열 때 소유 그룹의 권한으로 실행
      2. 다른 사용자가 새 디렉토리를 만들 때 소유 그룹의 권한으로 생성
      3. 공통의 작업 공간을 만들 때 활용
    3. sticky bit - 기타 사용자 권한 중 x가 t로 되어 있는 경우

      1. 디렉토리 내 파일을 소유한 사용자만 삭제 가능
      파일디렉토리
      setuid소유자 권한 동작X
      setgid소유 그룹 권한 동작파일 생성 시 소유 그룹이 디렉토리의 소유 그룹 상속
      sticky bitX본인 소유 파일만 삭제 가능
    4. 확장 권한 부여 방식

      1. chmod u+s, g+s, o+t <파알 또는 디렉토리>
  2. 접근 제어 리스트(Acess Control List)
    1. 파일의 권한을 세부적으로 주기 위해 사용
    2. drwxr-sr-x+ 처럼 일반적인 권한 외 세부 권한을 주게되면 권한의 맨 마지막 문자가 . 이 아닌 + 로 되어있다.
    3. getfacl <파일/디렉토리명> - ACL의 적용 여부 및 세부 권한 확인
    4. setfacl -m u:vagrant:rw- test-acl - vagrant 사용자에게 test-acl의 권한을 사용자 권한인 rw- 부여
    5. 파일 권한 비교 순서
      1. 사용자 이름 ↔ 소유자 이름 비교
      2. ACL의 사용자 이름 비교
      3. 사용자 그룹 ↔ 소유자 그룹 비교
      4. ACL의 그룹 비교
      5. 기타 권한 비교
    6. ACL mask - ACL에서 지정할 수 있는 최대 권한을 표현
      1. setfacl -m m::rwx test-acl - ACL 마스크를 모든 권한 허용으로 변경
      2. 소유자는 ACL 마스크 권한 제한의 영향 X
  3. 기본 접근 제어 리스트(Default ACL)
    1. 디렉토리에 설정하는 ACL로 파일 생성 시 기본 ACL 이 상속
    2. 디렉토리에만 설정
    3. setfacl -m d:u:vagrant:rwx <디렉토리명> - 기존 ACL 세팅에 d가 추가된 모양

작업 스케줄링

  1. 단발성 작업 예약
    1. at - at [option] time-spec
    2. a. 명령어 입력 후 at> 로 프롬프트가 변경되면 작업 또는 스크립트 파일을 입력 후 Ctrl + D를 통해 빠져나올 수 있다.
    3. at now +1min
  2. 주기적 작업 예약
    1. crontab
      1. crontab -e → 작업 예약
      2. crontab -l → 작업 리스트
      3. 분/시/일/월/요일 명령어 순으로 입력
      4. 예시 - */2 * * * 1-5 ll etc - 월-금 사이 2분 단위 실행
      5. crontab 작업은 실행한 유저의 이름으로 실행
      6. /etc/crontab 을 사용해 직접 작업 예약하는 경우 user-name이 요일-명령어 사이에 들어간다.
    2. systemd.timer

디스크 관리

  1. 파티션
    1. 파티션 기능 별 차이

      MBR 파티션GPT 파티션
      파티션 수기본 4 ~ 최대 16128
      디스크 크기(최대)2 TB8 ZB
      부팅 지원BIOS / UEFI 지원UEFI
    2. (sudo)lsblk - 리눅스 스토리지 디바이스 확인

      1. 리눅스 시스템에서는 장치 이름에 따라 스토리지 연결 방식을 알 수 있음
      2. hd - E-IDE
      3. sd - SATA / SCSI / SA-SCSI
      4. sr - CD_ROM / DVD-ROM 등 ODD
  2. 디스크 명령어
    1. fdisk - MBR
      1. fdisk /dev/sdb
        1. 디스크 작업 시작(/dev/sdb는 디스크 파일 위치)
      2. 파티션 타입
        1. Primary
          1. 기본 파티션 == 최대 4개
          2. 실질적 사용 공간
        2. Extended
          1. 확장 파티션
          2. 하나만 생성 가능(Primary + Extended 를 합해 4개)
          3. 예약 개념 (Logical 파티션 만들기 위한 공간)
        3. Logical
          1. 논리 파티션
          2. 실질적 사용 공간
          3. Extended 파티션 범위 내 생성 가능
    2. gdisk - GPT
    3. parted
      1. MBR, GPT 모두 사용 가능
      2. Script 용도

파일 시스템

  • 구조화된 일련의 정보를 구성하는 파일과 디렉토리의 집합
  • 어떻게 파일을 읽고 쓸 것인가의 설정
  • 디스크 물리 연결 → 파티션 설정 → 파일 시스템 설정(=포맷) → 파일 시스템 마운트
  1. 디스크 기반 파일 시스템(DBFS)
    1. EXT
      1. 리눅스용 확장 파일 시스템
    2. XFS
      1. 최신 리눅스의 기본 파일시스템으로 사용
  2. Pseudo 파일 시스템
    1. 시스템 성능을 높이기 위한 메모리 기반의 파일 시스템
  3. 파일시스템 설정
    1. mkfs - make file system
      1. mkfs -t [filesystem-type] partition
        1. 예) mkfs -t ext4 /dev/sdb1
      2. mkfs.<TAB> - 부여 가능한 파일 시스템 타입 확인
      3. 성공 시 블록 장치에 UUID 부여
    2. blkid - 블록 장치의 파일 시스템 종류와 UUID⁽¹⁾를 출력
      1. 예) blkid /dev/sdb1
  4. 파일시스템 마운트
    1. / 아래 파일시스템이 연결될 수 있는 경로 생성 혹은 지정
    2. 반드시 비어있는 디렉토리에 마운트 해야 한다.
    3. 임시 사용 - mount, 영구 사용 - /etc/fstab
    4. mount [option] {partition | UUID } mount-point
      1. mount /dev/sdb2 /media/ - 마운트
      2. mount | grep /dev/sdb2 - 마운트 확인
      3. umount /dev/sdb2(또는 마운트 포인트) - 마운트 해제
    5. /etc/fstab - file system table
      1. fstab 작성 방법

        순서의미설명
        1Device(UUID)UUID 또는 마운트 포인트
        2MountPoint
        3FStype
        4Option주로 default
        5Dump백업 설정(0,1)
        6FScheck파일 시스템 체크(0,1)
      2. mount -a - fstab 에 있는 모든 정보를 한번에 마운트

  5. 스왑 메모리
    1. 물리 메모리를 보조하기 위한 가상 메모리(물리+SWAP)
    2. 디스크 장치에 생성되며 RAM의 부족을 일부 해결 가능
    3. fdisk 에서 스왑 설정 시 파티션 타입을 변경해서 명시적으로 알려주는 것이 추후 작업에 도움이 될 수 있음(t 옵션)
    4. Paged-in/out
      1. in : swap → RAM
      2. out : RAM → swap
    5. 스왑 메모리 설정
      1. mkswap /dev/sdc2 - /dev/sdc2 를 swap 파티션 설정
      2. swapon /dev/sdc2 - swap 메모리 설정(임시)
      3. swapoff /dev/sdc2 - swap 메모리 해제(임시)
      4. vi /etc/fstab/dev/sdc2 swap swap default 0 0 (영구)
      5. swapon -a - /etc/fstab 에 있는 모든 swap 반영
    6. 스왑 메모리 확인
      1. free -h - 스왑 메모리 크기 표현(사용 중 크기 포함)
      2. swapon - 장치 이름과 스왑 메모리 크기 표현

논리 볼륨 관리

물리 적인 디스크를 논리적 볼륨으로 묶어 사용 가능하게 해주는 기능

  1. 특징
    1. 스냅샷 지원
    2. 데이터를 다른 디스크에 옮겨두고 논리 볼륨 구성 디스크 제거 가능
    3. 디스크 파티션 구조와 상관 없이 원하는 크기의 볼륨 생성 가능
    4. RAID 적용 가능
    5. 논리 볼륨 정의 단계
      1. 디스크 장치 → 물리 볼륨 → 볼륨 그룹 생성 → 논리 볼륨 생성
    6. PE(Physical Extent) - 볼륨 그룹의 최소 단위(default : 4MB)
    7. PV(물리 볼륨) - 물리적 실제 장치
    8. VG(볼륨 그룹) - 하나 이상의 PV의 집합
    9. LV(논리 볼륨) - 마운트 할 수 있는 스토리지 장치
  2. 논리 볼륨 설정
    1. 구성
      1. 파티셔닝
        1. fdisk
      2. 물리 볼륨 생성
        1. pvcreate <파티션1> <파티션2>..>
        2. pvcreate test-vg /dev/sdd7 /dev/sdd8 /dev/sdd9
        3. pvremove
      3. 볼륨 그룹 구성
        1. vgcreate <VG명> <PV1>..<PV2>...
      4. 논리 볼륨 생성
        1. -n - 생략 시 LV명 자동 생성
        2. -l - PE(default 4MB) 개수를 지정
        3. -L - 원하는 용량을 직접 지정
        4. lvcreate -n <LV이름> -L <볼륨 크기> <VG명>
        5. lvcreate -n test-lv -L 2G test-vg
      5. 파일시스템 등록
        1. mkfs -t xfs /dev/<볼륨그룹>/<논리볼륨>
      6. 마운트
        1. (임시)mount /dev/test-vg/test-lv /mnt/lvm/
        2. (영구)vi /etc/fstab/dev/test-vg/test-lv /mnt/lvm xfs defaults 0 0mount -a
        3. umount <디렉토리 경로>
    2. 추가
      1. VG 추가
        1. vgextend <VG명> <장치명>
          1. vgextend test-vg /dev/sdd10
      2. LV 추가
      3. </dev/VG명/LV명> → 장치명
      4. lvextend -L <용량> <장치명> -r
        1. lvextend -L 2.5G = 목표치 설정
        2. lvextend -L +500M = 절대치 증가 설정
        3. -r 이미 마운트 된 논리 볼륨의 크기를 resize
        4. -r 을 생략할 경우 xfs_growfs <장치명> 을 사용해야 정상적으로 사용가능한 볼륨이 된다.
    3. 삭제
      1. umount <디렉토리> - 마운트 해제
      2. lvremove <장치명> - LV 삭제
      3. vgremove <vg명> - VG 삭제
      4. pvremove <장치명> - PV 삭제
      5. 파일 시스템은 별도 삭제 하지 않고 진행
    4. 축소
      1. LV는 실제 사용하는 디스크와 같기 때문에 축소 기능은 있지만 사용X
      2. VG는 디스크 교체 시 축소하는 경우가 존재
      3. 보편적으로 확장 → 축소 형태로 진행
      4. vgreduce <VG명> <장치명>
    5. 디스크 교체 시나리오
      1. fdisk /dev/sde
      2. pvcreate /dev/sde1
      3. vgextend test-vg /dev/sde1
      4. pvmove /dev/sdd10
      5. vgreduce test-vg /dev/sdd10
      6. pvremove /dev/sdd10
      7. fdisk /dev/sdd
    6. 세팅 확인 명령어
      1. vgs - VG 요약 확인
      2. vgsdisplay - VG 상세 확인
      3. lvs - LV 요약 확인
      4. lvdisplay - LV 상세 확인

로그 관리

이벤트에 관한 기록

  1. Systemd-journald (/run/log/journal)
    1. 저널 데이터
    2. 임시 로그 파일(재부팅 시 초기화)
    3. journalctl - 로그 확인
      1. journalctl -n 10 - 현재 시점부터 10줄 출력
      2. journalctl --since "2024-05-28 06:00:00 - 지정 시점 이후 로그 출력
      3. journalctl --since "2024-05-28 06:00:00" --until "2024-05-28 08:00:00" - since 와 until 사이 기록만
    4. 영구 저장 방법
      1. vi /etc/systemd/journald.conf
        1. #Stroage=auto → Stroage=Permernent → systemctl restart systemd-journald
  2. rsyslogd (/var/log)
    1. syslog
    2. /etc/rsyslog.conf 를 참고해 /var/log 디렉토리에 로그 종류 별로 텍스트 파일 저장
    3. 영구 로그 파일
    4. 기본 규칙으로 4주간 유지
    5. /etc/rsyslog.conf
      1. 로그가 저장되는 파일의 이름과 저장되는 내용이 정의
      2. systemctl restart rsyslog - 설정 수정 후 재시작
    6. tail -f <작업파일> - 실시간 보기
  3. logrotate
    1. cron 작업에 의해 하루 한번 실행

    2. 로그 파일의 크기가 너무 크거나 일정 기간이 지나면 기존 로그를 백업 후 새 로그파일로 저장 시작

    3. /etc/logrotate.conf - 전역 설정

    4. /etc/logrotate.conf/파일명 - 개별 설정

      1. 개별 로그 설정 예시
      # 순환 대상
      /var/log/testlog/testlog.log { 
      size=3k # 3k 이상 시 순환
      create 600 root sys # create=생성 600(권한)/소유자/그룹
      rotate 3 # 최대 로그 저장 수
      nodateext # 날짜 형식 미적용
      }
    5. 수동 로그 순환

      1. 예시
      logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
      ls -l /var/log/testlog
  4. logger
    1. 임의의 메시지를 생성(테스트 용도)
    2. logger -p local1.emerg "Logger test"

NTP(Network Time Protocol)

컴퓨터 시스템의 시간을 동기화 할 때 사용하는 프로토콜

  1. chronyd ( /etc/chrony.conf )
    1. /etc/chrony.conf 에 내가 받고 싶은 NTP 서버를 세팅
      1. server <주소> iburst
    2. chronyc sources - 설정한 NTP 서버에서 시간 동기화
  2. 한국 시간으로 Timezone 변경
    1. timedatectl 로 Time zone 확인
    2. timedatectl set-timezone Asia/Seoul 로 Timezone 변경

systemd

  • PID 1 번 프로세스
  • 시스템, 로그, 서비스, 초기화 스크립트 등 시스템 관리 전반을 담당
  1. 특징
    1. 부팅 시 서비스 병렬 시작
    2. 버스,소켓,장치,경로 유닛이 사용자가 요청 시 모두 자동 실행
    3. 스냅샷 지원 - 스냅샷 유닛 파일은 디스크 저장X
    4. 등 여러가지 특징이 존재
  2. 유닛
    1. systemd는 유닛 단위로 시스템을 관리
    2. 유닛 파일 위치
      1. /etc/systemd/system - 수동으로 생성 및 관리 유닛 저장
      2. /run/systemd/system - 임시 저장
      3. /usr/lib/systemd/system - 유닛 파일의 원본
    3. 유닛 유형
      1. service, socket 등이 존재하며 파일의 이름 뒤에 .service 처럼 유형을 파일 이름으로 가진다.
    4. 명령어
      1. systemctl list-units - 실행 중인 모든 유닛
      2. systemctl list-unit-files - 설치된 모든 유닛
      3. systemctl status <유닛> s - 모든 유닛 활성화&상태 확인
        1. systemctl is-enable <유닛> - 특정 유닛 활성화
        2. systemctl is-active <유닛> - 특정 유닛 실행 상태
      4. systemctl start <유닛> - 서비스 시작 ↔ stop
      5. systemctl restart <유닛> - 서비스 재시작
      6. systemctl enable <유닛> - 부팅 시 자동 시작 ↔ disable
      7. systemctl poweroff - 시스템 종료 →> reboot
        1. 실행 중인 서비스만 건들기 때문에 절차가 간단하고 빠르게 종료된다.
  3. 유저 사용 systemd 타겟 유닛
    1. emergency.target - 가능한 최소한의 환경을 제공하는 긴급 쉘
    2. resque.tartget - 단일 사용자 환경 제공 복구 쉘
      1. 부팅을 완료 할 수 없을 때 사용
    3. multi-user.target - CLI 환경 제공
  4. systemd get-default - default.target 에 연결된 타겟 유닛
  5. systemd isolate <타겟 유닛> - 런타임 상태에서 사용 중인 타켓 유닛 변경

Root 패스워드 복구

  1. virtualbox 가상 머신 화면 오픈
  2. 사용자 접속 : vagrant / vagrant
  3. 재부팅 → systemctl reboot
  4. 부트 로더에서 부팅할 커널 항목 선택
    1. F12 눌러 부트 모드 선택창에 진입 이후b를 누른 뒤 방향키로 rescue 모드 고정
      1. 부팅 속도가 너무 빨라 잠시 잡아놓는 용도
    2. Rescue 모드에 커서를 위치 시켜놓은 뒤 e 를 눌러 edit 모드 진입
  5. 커널 항목 편집
    1. linux 가 쓰여 있는 문구의 맨 뒤에 rd.break 를 추가 후 Ctrl + X 를 누르면 부팅 과정이 다시 진행
  6. 루트 파일 시스템 읽기쓰기로 재마운트
    1. /sysroot = /
    2. mount -o remount,rw /sysroot - 기존 읽기 전용인 /sysroot 디렉토리를 rw로 변경
    3. chroot /sysroot - 지정한 디렉토리를 / 로 설정
  7. root 패스워드 지정
    1. passwd - root 패스워드 복구
    2. touch /.autorelabel
      1. 시스템 부팅 과정에서의 조건분기에 사용 파일 → SELinux 관련 구성 초기화
      2. 시스템은 부팅 시 해당 파일이 있다면 파일에 대한 label을 진행한다.

리눅스 복구 모드

  1. root 패스워드 복구 처럼 진행하며 rd.break 대신 systemd.unit.rescue.target 을 입력해 Ctrl + X 로 이후 작업을 진행한다.

리눅스 폰트 적용

  1. yum install fontconfig
  2. /usr/share/fonts 에 원하는 폰트 다운로드(wget, curl…)
    1. 해당 디렉토리는 시스템 전체에서 사용 가능한 폰트를 관리
  3. fc-cache -f -v - 폰트 반영
    1. fc-cache - 시스템 내 폰트를 읽어 반영
    2. -f - 강제 재생성
    3. -v - 상세 정보 보기
  4. fc-list | grep <폰트명> - 반영된 폰트 확인

네트워크 관리

VirtualBox의 네트워크 타입

  1. NAT - VB 내 고정된 IP 값을 가지며 인터넷만 가능
  2. Bridge - 실제 내 장비의 IP 대역을 쓰지만 설정을 잘못 하는 경우 주변까지 문제가 생길 수 있어 IP구성에 익숙하지 않으면 사용 X
  3. 내부 네트워크 - 가상 머신 사이의 네트워크 연결 가능
  4. 호스트 어댑터
    1. 가상머신 끼리 통신 O
    2. 호스트에서 가상머신 접속 O
    3. 내부 → 외부O, 외부 → 내부 X
    4. 다른 네트워크와 혼용할 경우 외부에서 내부로 접속에 혼동이 생길 수 있음(네트워크 별로 게이트웨이 설정 때문)
  5. NAT 네트워크
    1. 인터넷 + VM ↔ VM

네트워크 확인

  1. ip link show - 내 컴퓨터의 네트워크 인터페이스 정보 확인
  2. ipconfig - 네트워크 인터페이스 구성 및 확인
  3. ip route - 내 라우팅 테이블 확인(게이트웨이)
  4. traceroute - 내 컴퓨터에서 목적지까지 지나치는 라우터 경로 출력
  5. tracepath - traceroute 보다 간결한 결과 표현
  6. ping - 목적지까지 지연시간 확인

네트워크 관리

  1. NetworkManager
    1. 네트워크 설정을 동적으로 변경시켜 네트워크 설정이 자주 변경되는 시스템에서 유리
    2. NM이 실행 중일 때 nmcli, nmtui 등을 사용해 네트워크 설정
    3. systemctl restart NetworkManager.service - 네트워크 재시작`
    4. nmcli
      1. nmcli device
        1. 장치 상태 확인 및 설정
        2. 장치 이름 기준
      2. nmcli connection
        1. 연결 설정 추가, 변경, 삭제
        2. 설정 값 기준(장치는 있지만 설정하지 않은 경우 안보임)
        3. 명령어
          1. nmcli connection show eth0
          2. nmcli connection add type ethernet ifname eth1 con-name first ipv4.addresses 10.0.2.100/24 ipv4.gateway 10.0.2.1 ipv4.dns 10.0.2.1 ipv4.method manual
            1. type - 연결 유형
            2. con-name - 연결 이름
            3. ifname - 인터페이스 이름
            4. ipv4 설정 생략 시 DHCP 설정 부여
            5. ipv4.addresses - ip, 서브넷 마스크
            6. nmcli con mod CON-NAME ipv4.dns-priority 1 - dns 우선순위 변경(/etc/resolv.conf)
            7. ipv4.method - IP정보 동적(auto) 및 정적(manual) 선택
          3. nmcli connection up <con-name> - 특정 연결 활성화
            1. 장치가 남지 않는 경우 기존 연결을 내리고 지정된 연결이 장치에 연결
            2. 기존 연결을 다른 연결로 대체하고 싶을 때 down 을 입력하지 말고 다른 연결을 up
            3. 장치 자체를 내리고 싶다면 device를 연결해제 한다.
    5. nmtui
      1. nmcli 의 대화형 인터페이스
  2. /etc/sysconfig/network-scripts/ifcfg-*
    1. RHEL7~8 네트워크 설정 파일 경로
  3. /etc/NetworkManager/system-connections
    1. RHEL9 경로 네트워크 설정 파일 경로
  4. Virtual Bridge
    1. 호스트와 KVM(커널 기반 VM)으로 구성한 가상 머신 간 통신을 위한 가상 인터페이스 장치

Oh-My-Zsh + powerlevel10k 적용(root)

# root 계정에 zsh + powerlevel10k 적용
sudo -i

yum install -y zsh git wget

sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

lchsh # /bin/zsh 입력

git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k

vi ~/.zshrc # ZSH_THEME="powerlevel10k/powerlevel10k" 변경

source ~/.zshrc

# Plugin setting
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

vi ~/.zshrc # plugins=(git zsh-syntax-highlighting zsh-autosuggestions) 변경

source ~/.zshrc

# 약어 적용
yum install -y neovim bat

vi ~/.zshrc 
# alias ll="ls -alF"
# alias vi="nvim"
# alias cat="bat"
# alias cl="clear"

source ~/.zshrc

소프트웨어 패키지

  • RPM ( Redhat Package Manager )
  • YUM ( Yellowdog Updater Modified )

yum

  • Rocky에서는 dnf 또는 yum 패키지 매니저 사용
  • 패키지 관련 종속성 해결
  • 설정 파일
    • (root) /etc/yum.repos.d/
    • Log - /var/log/dnf.*
    • 모든 파일의 확장자는 .repo
      • 설정파일
        • ID
        • 저장소 이름
        • 미러 서버
        • 리포지토리 주소
        • gpgkey - 패키지 다운을 위해 키가 필요한 경우 1 ↔ 0
        • enable - 값이 1일 경우 리포지토리 파일을 사용해 패키지를 사용해 패키지 설치
  • yum 서브커맨드
    • repolist all - 설정 리포지토리 파일 인식 확인
    • info - 패키지 정보 확인
    • provides - 파일 이름 기준 패키지 추적
      • 명령어와 패키지 이름이 다를 때 찾기 편함
    • search - 패키지 검색 용도
    • list - 패키지 리스트 목록 ( @이 붙어 있는 패키지는 이미 설치)
    • history - 설치, 삭제 내역 확인(간략한 표현)
      • history undo - 기존 내역 번호를 기준으로 되돌리기
    • update - 현재 패키지를 삭제 후 새 패키지를 설치 하는 방식
      • 전체 update는 시간이 오래 걸리기 때문에 업데이트가 필요한 패키지만 골라 update하거나 예약 작업 권장
      • 커널도 update가 되며 커널은 구버전이 있는 상태에서 새버전을 설치
  • 특이사항
    • SSL 설정 후 아래와 같은 오류가 나는 경우 vi /etc/yum.conf 에 sslverify=false 를 추가한다.

      Extra Packages for Enterprise Linux 9 - x86_64                                          0.0  B/s |   0  B     00:03
      Errors during downloading metadata for repository 'epel':
        - Curl error (60): SSL peer certificate or SSH remote key was not OK for https://mirrors.fedoraproject.org/metalink?repo=epel-9&arch=x86_64&infra=$infra&content=pub/rocky&protocol=https [SSL certificate problem: unable to get local issuer certificate]
      Error: Failed to download metadata for repo 'epel': Cannot prepare internal mirrorlist: Curl error (60): SSL peer certificate or SSH remote key was not OK for https://mirrors.fedoraproject.org/metalink?repo=epel-9&arch=x86_64&infra=$infra&content=pub/rocky&protocol=https [SSL certificate problem: unable to get local issuer certificate]

OpenSSH(Open Secure Shell)

원격 접속 시 데이터의 평문 전송을 막고 암호화 전송을 위해 SSH를 사용

SSH 접속 실습

  1. vagrant 를 통해 2개의 VM 생성
  2. Nat Network 주소 대역 변경
    1. 192.168.10.0/24
  3. 가상머신 IP 주소 수동 설정
    1. (server1) ip address - 192.168.10.2
    2. (server2) ip address - 192.168.10.3
    3. gateway - 192.168.10.1
    4. DNS - 8.8.8.8
  4. SSH 접속 설정
    1. /etc/ssh/sshd_config
      1. PasswordAuthentication no → yes
      2. systemctl restart sshd
  5. 서로 다른 서버로 ssh 서버 접속 테스트
    1. ssh ID@IP

/etc/ssh/sshd_config - OpenSSH 설정 파일 위치

  1. /etc/ssh/sshd_config.d/*.conf - 해당 파일에 설정을 추가할 경우 sshd_config에 include 되어 같이 포함되어 동작
  2. Port 번호를 변경 하고 싶은 경우 설정 파일에서 수정(기본값 22)

OpenSSH(Open Secure Shell) 키 기반 인증

  • 키 기반 인증을 이용하면 사용자가 별도의 id/pw 입력해 접속할 필요가 없다.(최초 등록 시는 필요)
  • 주로 클라우드 서비스에서 사용
  • ssh-keygen - 대화형 키 생성 도구
    • 공개키 / 비밀키 2개를 생성
    • 비밀키의 권한이 소유자 권환 외 권환이 활성화 되어 있을 경우 에러 발생
  • ssh-copy-id 유저@IP - 내 키를 접속할 호스트에 복사
  • 클라이언트가 키를 만들어 공개키를 호스트로 복사해주는 형태로 구성
  • 키는 사용자별로 구성
  • SSH 키인증을 사용하려면 SSH 설정에서 패스워드 기반 로그인 기능을 활성화 해줘야 한다.(최초 접속 자체가 안되기 때문)
  • ssh 접속 시 사용자@ip 를 매번 적기 귀찮기 때문에 ~/.ssh/config 파일을 만들어 Host 이름을 설정하면 좀 더 손 쉽게 접속 가능
    Host [약칭]
    	HostName [접속 서버 IP]
    	User [접속 서버 ID]
    	IdentityFile [키 위치 등록(~/.ssh/id_rsa)]

SCP (Secure Copy)

  • ssh 를 이용해 원격으로 파일 전송
  • 사용자 권한 & 파일의 위치를 알고 있어야 사용 가능
  • 파일을 가져올 지 건네줄 지는 시작지와 도착지에 따라 바뀐다.
  • scp [내 서버 경로] [도착지ID]@[도착지IP]:[도착지 서버 경로] - send
  • scp [도착지ID]@[도착지IP]:[도착지 서버 경로] [내 서버 경로] - receive
  • 디렉토리를 보내거나 가져올 때 -r 옵션 추가

SFTP(Secure File Transfer Protocol)

  • ssh + ftp
  • 보내기 -put
  • 받기 - get
    • 별도 위치를 지정하지 않는 경우 접속전 위치에 파일 다운로드
  • sftp [도착지ID]@[도착지IP] → 대화형 모드로 이동

방화벽 관리

  • 외부 네트워크에서 내부 시스템 접근을 인가받지 않은 네트워크 패킷이 들어오지 못하게 차단해주는 도구
  • iptables (service)
  • Firewalld ( Daemon & service )
  • iptables + firewalld = netfilter
  • 영역, 서비스 별 규칙 설정

firewalld

  • 규칙을 XML 파일형태로 보관
  • Runtime(임시) 및 Permanent(영구) 설정
  • 경로 /usr/lib/fierwalld , /etc/firewalld
    • /usr/lib/firewalld/zones - 영역 별 규칙 설정
      • 사전 정의 영역(Pre-defined Zone)
        • 변경 불가 영역
          • Block - 모든 패킷 거부(안받기)
          • Drop - 모든 패킷 폐기(무시)
          • Trusted - 모든 패킷 허용
    • /usr/lib/firewalld/servies - 서비스 별 규칙 설정
  • firewall-cmd
    • 별도 zone 지정 하지 않을 경우 기본 영역에 세팅
    • firewall-cmd --get-default-zone - 기본 영역 확인
    • firewall-cmd --list-all - 지정 영역 또는 기본 영역 규칙 확인
    • firewall-cmd --change-interface=[인터페이스ID] --zone=internal - 인터페이스(eth0, eth1) zone 변경
    • firewall-cmd --add-source [IP주소+서브넷마스크] - 특정 주소 대역 통과
    • firewall-cmd --list-source - source 리스트 확인
    • 즉시 & 영구 설정을 원한다면 —permanent 옵션과 일반 추가 옵션을 같이 사용한다.
    • firewall-cmd --list-all --permanent - 영구 적용 규칙 조회
    • firewall-cmd --add-service=http - http 서비스 통과
    • firewall-cmd --add-port=1234/tcp - TCP 1234 포트 통과
    • firewall-cmd --add-service=[서비스명] --permanent- 서비스 통과 설정 영구 적용
    • firewall-cmd --reload - 임시 값 모두 삭제 & 영구 설정 즉시 적용
    • firewall-cmd remove-service --permanent - 영구 설정 서비스 삭제
  • 포트포워딩 규칙 추가
    • 포트포워딩 - 포트 번호에 따라 전달해주는 규칙
    • firewall-cmd --zone=internal --add-forwad-port=port:5000=proto=tcp:toport=22:toaddr=192.168.0.100
      • TCP 5000 포트로 접속 시 192.168.0.100 의 22번 포트로 접속

SELinux

기존 리눅스 보다 강화된 보안의 리눅스

DAC 모델

  • 객체에 대한 권한만 설정되어 있다면 접근 가능

MAC 모델

  • 객체에 대한 권한(=사용자 권한)
  • 보안 레이블
  • 정책 허용 스위치
  • SELinux의 모델
  • SELinux 모드 종류
    • Enforcing - 규칙에 따라 접근 제어 사용
    • Permissive
      • 규칙에 따라 접근 제어를 사용
      • 정책에 따라 접근 제어 사용 X
      • 규칙에 위반 되는 행위는 로그 기록에 남김
    • Disabled - 정책에 따라 접근 제어 사용 X
  • 모드 설정 방식
    • 파일 - 영구(/etc/selinux/config)
    • 명령어 - 임시(런타임)
      • setenforce 0 → Permissive
      • setenforce 1 → Enforcing
      • 명령어로는 Disabled 를 설정할 수 없음

RBAC 모델

  • 역할² 기반 접근

semanage 도구

  • 컨텍스트
    • 컨텍스트 확인
      • ps axZ
      • ls -lZ
      • id
    • 형태
      • 사용자:역할:유형:레벨
      • 3번째인 유형 컨텍스트가 중요하며 유형 컨텍스트는 semanage 도구로 변경 할 수 있다.
  • 명령어
    • chcon - 컨텍스트 변경

      • chcon 으로 컨텍스트 변경 시 리로드, 또는 재부팅 등 다른 이유로 초기화 될 수 있음(런타임)
      • chcon -t TYPE FILE/DIRECTORY - 컨텍스트 유형 변경
      • chcon -R -t TYPE DIRECTORY - 하위 객체까지 유형 변경
    • restorecon - 파일의 기본 SELinux 컨텍스트 복구

      • restorecon FILE/DIRECTORY - 객체 컨텍스트 유형 복구
      • restorecon -Rv FILE/DIRECTORY - 하위 객체까지 유형 복구 + 결과 보기
    • semanage
      - 패키지 찾기
      - yum search PACKAGENAME
      - yum provides PACKAGENAME - 추천
      - semanage fcontext ARGS
      - -l : 컨텍스트 목록
      - -a : 새 규칙 추가
      - -m : 수정
      - -d : 삭제
      - -t : 유형
      - semanage fcontext -a -t TYPENAME OBJECT
      - 파일이나 디렉토리의 컨텍스트 기본값을 변경
      - 기존 항목 변경되지 않음
      - semanage fcontext -a -t 'tmp_t' '/selinux-test(/.*)?'
      - 하위 파일까지 모두 교체

      SELinux 부울

    • 시스템 운영 중 정책의 동작을 변경할 수 있는 스위치

    • 명령어
      - semanage boolean -l :
      - boolean 이름
      - [ON | OFF]
      - 기능 설명
      - semanage boolean -m --on BOOLEAN-NAME
      - 불린 기능을 ON으로 변경

      SELinux 포트 레이블

    • 서비스의 기본 사용 포트 외 다른 포트를 사용하려면 포트 레이블 부여 필요

    • 명령어

      • 컨텍스트와 옵션이 거의 유사
      • semanage port -l | grep SERVICE
      • semanage port -a -t 'TYPE' PORT -p PROTOCOL
        • 특정 TYPE에 PORT/PROTOCOL 을 추가
      • 예를 들어 ssh의 기본 포트인 22를 2222로 변경할 때 /etc/ssh/sshd_config 의 포트 옵션을 2222로 수정 후 에러를 확인해보면 2222 포트에 대한 권한이 거절되었다고 한다.
      • 이 때 ssh_port_t 타입에 2222번 포트 레이블을 추가 후 서비스 재시작을 하면 정상적으로 2222번 포트 사용을 할 수 있다.

DNS

도메인 이름 → IP 변환

  • 도메인 계층
    1. . (root)
    2. .com, .kr, .go. jp, .net …
    3. naver, daum
    4. www.naver.com 이라는 DNS가 있으면 뒤부터 앞으로 계층 별로 검색한다.
    5. / → .com → naver

DNS 서버 구성(기본)

  1. 패키지 설치
  2. 설정
    1. 설정 파일 수정
    2. 유저 생성
    3. 파티션 생성
  3. 서비스 실행
  4. 방화벽 설정

정방향 BIND 구성

  1. yum install -y bind

  2. vi /etc/named.conf

    # Any 설정
    listen-on port 53 { any; }; 
    allow-query     { any; }; # query 허용 src
    
    # Zone(=도메인 영역) 추가
    zone "sesac.com" IN {
            type master;
            file "sesac.zone";
    };
  3. cp /var/named/named.empty /var/named/sesac.zone

    1. 빈 양식 파일을 가져와 편집

      $TTL 3H
      @       IN SOA  ns.sesac.com meteo0718.naver.com. (
                                              20240603        ; serial                                                1D      ; refresh
                                              1H      ; retry
                                              1W      ; expire
                                              3H )    ; minimum
              NS      ns.sesac.com. # 에러나면 @ 추가해보기 
      				A       192.168.10.2
      ns      A       192.168.10.10
      www     A       192.168.10.20
      blog    A       192.168.10.30
      news    A       192.168.10.40
    2. chown :named /var/named/sesac.zone

      1. 소유 그룹 변경(DNS 데몬)
    3. CNAME = 바로가기 와 비슷한 유형

  4. zone 설정 체크

    1. named-checkconf /var/named/sesac.zone
    2. named-checkzone sesac.com /var/named/sesac.zone
  5. 서비스 재시작

    1. systemctl restart named.service
    2. systemctl enable --now named.service
      1. 서비스 허가와 동시에 서비스 실행
    3. 방화벽 설정
      1. firewall-cmd --add-service=dns --permanent
      2. firewall-cmd --reload
  6. host -t A www.sesac.com <내 IP>

  7. 정확히 구성했음에도 DNS가 동작하지 않는다면 /etc/resolv.conf 의 네임서버 우선순위를 조절

역방향 BIND 구성

  1. 정방향 조회와 쌍을 이루며 PTR 레코드 설정을 위해 사용

  2. vi /etc/named.conf

    # Any 설정
    listen-on port 53 { any; }; 
    allow-query     { any; }; # query 허용 src
    
    # Zone(=도메인 영역) 추가
    zone "10.168.192.in-addr.arpa" IN { # 192.168.10.xxx 대역
            type master;
            file "192.168.10.zone";
    };
  3. cp /var/named/named.empty /var/named/sesac.zone

    1. 빈 양식 파일을 가져와 편집

      $TTL 3H
      @       IN SOA  ns.sesac.com meteo0718.naver.com. (
                                              20240603        ; serial                                                1D      ; refresh
                                              1H      ; retry
                                              1W      ; expire
                                              3H )    ; minimum
      @       NS      ns.sesac.com.
      10      PTR     ns.sesac.com.
      20      PTR     www.sesac.com.
      30      PTR     blog.sesac.com.
      40      PTR     news.sesac.com.
    2. chown :named /var/named/sesac.zone

      1. 소유 그룹 변경(DNS 데몬)
    3. CNAME = 바로가기 와 비슷한 유형

  4. 서비스 재시작 - systemctl restart named.service

  5. 설정 체크

    1. named-checkconf /etc/named.conf
    2. named-checkzone sesac.com /var/named/sesac.zone
  6. 방화벽 재시작 - firewall-cmd --reload

  7. 적용 확인 -host -t PTR www.sesac.com <내 IP>

DNS 이중화

  1. Master

    1. /etc/named.conf 의 zone 설정에 slave의 IP를 추가한다.
    zone "sesac.com" IN {
            type master;
            file "sesac.zone";
            allow-transfer {192.168.10.20;};
    };
    
    zone "10.168.192.in-addr.arpa" IN {
            type master;
            file "192.168.10.zone";
            allow-transfer {192.168.10.20;};
    };
  2. Slave

    1. etc/named.conf 의 zone 설정에 master의 IP를 작성한다.
    zone "sesac.com" IN {
            type slave;
            file "sesac.zone";
            masters {192.168.10.10;};
    };
    
    zone "10.168.192.in-addr.arpa" IN {
            type slave;
            file "192.168.10.zone";
            masters {192.168.10.10;};
    };

NFS 스토리지

윈도우 공유 폴더 처럼 파일을 공유하기 위한 분산 파일 시스템 프로토콜

네트워크로 파일 공유

  • 최신 엔터프라이즈 리눅스에서는 기본적으로 4.0 이상의 버전 사용
  • 서버 - 공유 디렉토리 지정
  • 클라이언트 - 파일 시스템 마운트

NFS 서버구성

  1. 서버
    1. yum install -y nfs-utils

    2. vi /etc/exports

      1. sync - 사용 중일 때 편집 안됨
      # Directory Target Option 
      /share 192.168.10.100/32(rw,sync) 
      # /share * 
      # /share 192.168.10.0/24
    3. exportfs -r - 편집한 /etc/exports 읽어오기

    4. systemctl enable --now nfs-server.service

    5. firewall-cmd --add-service=nfs --permanent

      1. firewall-cmd --reload
  2. 클라이언트
    1. yum install -y nfs-utils
    2. mount -t nfs -o rw,sync DEVICE M/POINT
      1. -t - 파일 시스템 유형 선택
      2. -o - 옵션(필수X, 서버 옵션을 추가
      3. DEVICE - SERVERIP:PATH
      4. M/POINT - 마운트 포인트
      5. mount -t nfs -o rw,sync ns.sesac.com:/nfs /mnt
      6. vi /etc/fstab - NFS 스토리지 영구 추가
        1. ns.sesac.com:/nfs /tmp nfs defatuls 0 0

NFS 자동 마운트

  • 디렉토리 자동 접근 시 자동 마운트
  • 일정 시간 미사용 시 마운트 해제
  • 클라이언트에서 설정
  • 맵 파일
    • 마스터 맵 ( /etc/auto.master )
    • 직접 맵
      • 마운트 포인트를 절대 경로 지정
    • 간접 맵
      • 마운트 포인트를 상대 경로 지정
    • 간접 와일드카드 맵
      • NFS 서버에서 동일한 경로 밑에 존재하는 다수 공유 디렉토리에 자동 마운트 설정
  • 실습
    • CLIENT = C, SERVER = S
    • 직접
      • (S) vi /etc/exports
        /autofs/direct 192.168.10.20/24(rw,sync)
      • (C)yum install -y autofs
      • (C)/etc/auto.master.d/vi /etc/auto.master.d/direct.autofs
        • 예시의 direct.autofs 는 임의의 이름이며 .autofs는 고정?

          /-    /etc/auto.direct # M/T, CONF
      • (C)vi /etc/auto.direct
        /mnt/nfs -rw,sync 192.168.10.20:/autofs/direct # MT/Option/SRC
      • (C,S)systemctl enable --now autofs
    • 간접
      • 마운트를 해도 접근 시 마운트
      • (C)/etc/auto.master.d/vi /etc/auto.master.d/indirect.autofs
        	/nfs    /etc/auto.indirect # MT/CONF
      • (C)vi /etc/auto.indirect
        indirect -rw,sync 192.168.10.10:/autofs/direct # CLIENT MT / 옵션 / 서버 SRC
      • (C)systemctl enable --now autofs
    • 간접 와일드카드
      • (C) vi /etc/auto.master.d/wild.autofs
        	/wild    /etc/auto.wild # M/T # Conf위치
      • (C)vi /etc/auto.wild
        * -rw,sync 192.168.10.20:/autofs/& 
      • (C)systemctl enable --now autofs

iSCSI 블록 스토리지

스토리지 구성

  • DAS (Direct Attached Storage) - 직접 연결
  • NAS (Network Attatched Storage) - 네트워크 연결
    • DAS의 물리적인 제약을 없앤 방식
    • 파일 기반
  • SAN(Storage Area Network) - 스토리지 전용 네트워크를 가짐
    • 디스크를 네트워크로 직접 연결
    • 블록 기반

iSCSI

  • IP-SAN의 방식 중 하나
  • 용어
    • Target - 장치 제공 시스템
    • Initiator - 블록 스토리지를 제공 받는 클라이언트 시스템
  • targetcli - 패키지, target - 서비스
  • firewall-cmd 설정
    • 허용 port = 3260
    • 허용 서비스 = iscsi
  • IQN 형식
    • iqn:2024-06.com.sesac:target
      • iqn: 고정
      • 2024-06 : 보통 제작한 당해년도, 월
      • .com.sesac:target : 보통 사용 도메인을 거꾸로 쓴 뒤 target, 또는 initiator 또는 임의 명칭 사용

iSCSI 실습

  1. Target 설정 (=서버)

    1. dnf install -y targetcli
    2. targetclils : 타겟 설정 초기화면
      1. backstores
        1. block
        2. fileio
        3. ramdisk
      2. iscsi - iqn 생성
        1. acls : 접근 제어 리스트
        2. luns : 스토리지 장치에 부여된 논리 장치번호
        3. Portals : IP주소와 포트번호
      3. backstores/block create dev=/dev/sdb1 name=iscsi-block - 새 블록 설정 생성
        1. name은 임의 설정
      4. iscsi/ create wwn=iqn.2024-06.com.sesac:target - iqn 생성
        1. 접속 주소가 target.sesac.com 인 경우 위 처럼 쓰며 서브도메인 앞은 .가 아닌 :를 사용
        2. iqn 생성 시 그룹 자동 생성
      5. iscsi/iqn.2024-06.com.sesac:target/tpg1/acls create iqn.2024-06.com.sesac:initiator - 초기자 iqn 허용
        1. tpg1 : 그룹 이름
      6. iscsi/iqn.2024-06.com.sesac:target/tpg1/luns create /backstores/block/iscsi-block - 논리 장치번호 block 연결
      7. exit → /etc/target/saveconfig.json 에 저장
      8. systemctl enable --now target
      9. firewall-cmd --add-service=iscsi-target
  2. Initiator 설정 (=클라이언트)

    1. dnf install -y iscsi-initiator-utils
    2. systemctl start iscsi - 서비스 시작 및 initiatorname.iscsi 폼 생성
    3. vi /etc/iscsi/initiatorname.iscsi
      1. InitiatorName=iqn.2024-06.com.sesac:initiator
    4. iscsiadm -m discovery -t st -p 192.168.10.10
      1. iscsi 서버 연결 확인
      2. st = sendtarget
      3. -p = target IP
    5. iscsiadm -m node -T [IQN] -l - 접속
      1. iscsiadm -m node -T iqn.2024-06.com.sesac:target -u - 해제
      2. iscsiadm -m node -T iqn.2024-06.com.sesac:target -o delete - 삭제
  3. Initiator 설정 시 discovery=O, 연결-X 인 경우

    1. /etc/initiatorname.iscsi 확인 후 재설정
    2. systemctl stop iscsi
    3. systemctl stop iscsid
    4. systemctl stop iscsid.socket
  4. Target을 통해 연결된 장치 확인

    1. iscsiadm -m session -P3 | tail -n1
  5. 장치 마운트 진행

    1. 파티셔닝
      1. fdisk
      2. 파티셔닝 후 lsblk 를 통해 인식이 안되는 경우 partprobe를 통에 수동으로 인식이 가능
    2. 파일 시스템 생성
      1. mkfs -t xfs /dev/sdb1
    3. 영구 마운트
      1. vi /etc/fstab
        1. /dev/sdb1 /var/lib/mysql xfs _netdev 0 0
      2. mount -a

Apache 웹 서버

httpd

  • 정적 웹사이트
  • 위치 및 설명
    위치설명
    /var/www웹 페이지 기본 디렉토리
    /etc/httpd/conf/httpd.conf웹 서버 주 설정 파일
    /etc/httpd/conf.d웹 서버 추가 설정 파일
    /etc/httpd/conf.modules.d웹 서버 + @ 모듈 설정 파일
    /usr/share.httpd테스트, 에러 페이지 등 기본 콘텐츠
    /usr/share/doc/httpd웹 서버 관련 문서 파일

httpd 실습

  1. dnf install -y httpd
    1. 패키시 설치 시 apache 라는 ID(48)/Group(48)이 자동 생성
  2. systemctl enable --now httpd - 서비스 허가 및 실행
    1. 메인 설정 파일 및 페이지에 추가 수정한 경우 서비스 재실행
  3. curl localhost - 웹서비스 접속 확인
  4. echo "test page" > /var/www/html/index.html + curl localhost
    1. index 페이지 동작 확인
  5. /etc/httpd/conf/httpd.conf - 구성 확인
    1. 포트 설정 변경 시 SELinux 설정도 같이 변경
  6. firewall-cmd --add-service=http - 방화벽 설정(런타임)
    1. firewall-cmd --add-service=http --permanent (영구)
    2. /usr/lib/firewalld/services/http.xml
      1. 위 파일에 기본 포트 번호가 추가 되어있어 기본 포트가 아닌 포트를 사용하려면 방화벽 추가 설정 필요
      2. semanage port -l | grep http - http 관련 SELinux 포트레이블 확인
      3. semanage port -a -t http_port_t 8888 -p tcp - 기본 포트 외 포트 지정 시 SELinux 포트레이블 허용(80→8888)

가상 호스트 구성

하나의 웹 서버에서 여러 웹 사이트를 서비스 할 때 사용

  • 이름 기반 가상 호스트
    • 다른 가상호스트 방식에 비해 편리해 주로 사용
    • /etc/httpd/conf.d 에 파일 생성
      • 00-default-vhost.conf 처럼 [NUMBER]-[NAME].conf 가 기본 형태
      • number 는 우선 순위
      • name 은 의미있는 이름
      • 00-default-vhost.conf 내용
        <VirtualHost *:80>
        	ServerName www.default-sesac.com
        	DocumentRoot /var/www/html
        </VirtualHost>
        
        <Directory /var/www/html>
        	AllowOverride   none
        	Require all granted
        </Directory>
      • 변경 후 systemctl restart httpd
      • 기본 경로 외 다른 경로 설정 시 SELinux 규칙에 따라 제대로 동작이 안되기 때문에 경로에 규칙을 추가해줘야 함
        • semanage fcontext -a -t httpd_sys_content_t "/web(/.*)" - web 디렉토리 아래 모든 경로에 규칙 추가
  • IP 기반 가상 호스트
  • 포트 기반 가상 호스트

HTTPS

평문으로 전송되는 HTTP의 보안을 강화하기 위한 방식

  1. 평문 전송 → 암호화 전송
  2. SSL 또는 TLS 프로토콜을 통해 전송

연결 방식

  1. Client Hello(C→S)
    1. 서버로 HTTPS 연결 요청
  2. Server Hello(S→C)
    1. Client Hello 의 응답으로 Server Hello와 서버의 인증서(공개키 포함)를 포함
  3. 인증서 확인 및 대칭키 전송(C→S)
    1. CA를 통해 서버의 인증서 검증
    2. 대칭키를 서버의 공개키로 암호화 해 전송
  4. 컨텐츠 전송(S→C)
    1. 전달받은 대칭키를 개인키로 복호화해 획득
    2. 연결 종료까지 모든 컨텐츠를 대칭키로 암호화 후 전송
  5. 사용 포트 443

HTTPS 서버 구성

  1. 사전 설정
    1. dnf install -y httpd - http 패키기 설치
    2. /var/www/html - html 파일 추가
    3. systectl enable --now httpd - http 서비스 실행
    4. firewall-cmd --add-service=http - 방화벽
    5. dnf install -y mod_ssl - SSL 패키지 설치
    6. /etc/httpd/conf.dssl.conf 파일 생성 확인
      1. SSLEngine 설정 활성화 확인 ( On )
    7. ls -lZ /etc/pki/tls → SELinux 타겟 확인
  2. 개인키 생성
    1. dnf install -y openssl - 개인키 생성 패키지 설치 및 확인
    2. openssl genrsa -out private.key 2048
      1. -out : 출력 경로(미설정 시 현재 위치)
      2. 2048 : 암호화 비트
      3. /etc/httpd/conf.d/ssl.conf 에 개인키 경로 반영
      4. SELinux 타겟 : cert_t
  3. CSR(Certificate Signing Request) 생성
    1. openssl req -new -key /etc/pki/tls/private/private.key -out /etc/pki/tls/certs/cert.csr
      1. req -new : CSR 파일 의미
      2. -key : 개인키 경로
      3. -out : 출력 경로
      4. SELinux 타겟 : cert_t
  4. CST(Certificate Signing Token) 생성
    1. openssl x509 -req -signkey /etc/pki/tls/private/private.key -in /etc/pki/tls/certs/cert.csr -out /etc/pki/tls/certs/cert.crt
      1. x509 : X.509 표준 인증서
      2. -req : csr 사용
      3. -signkey : 개인키 경로
      4. -in : csr 파일 경로
      5. -out : 출력 경로
    2. CSR과 CST의 차이
      1. CSR은 인증서 발급을 요청하는 파일이고, CST는 발급된 인증서를 설치하기 위한 토큰
  5. HTTPS 서비스 실행 및 방화벽 설정
    1. systemctl restart httpd
    2. firewall-cmd --add-service=https
  6. SSL/TLS 설정
    1. /etc/httpd/conf.d/ssl.conf 설정 수정
      1. SSLCertificateFile → certs.crt 파일 위치로 변경

      2. SSLCertificateKeyFile → 개인키 파일 위치로 변경

      3. 리다이렉트 설정 - HTTP 접속 시 HTTPS로 변경

        RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

동적 웹 콘텐츠 구성

  1. PHP 방식
    1. dnf install php -y
    2. dnf install php-mysqlnd -y - DB까지 연동 시
    3. /var/www/html/index.php

관계형 데이터베이스

설치

dnf install -y mariadb-server - 서버

dnf install -y mariadb - 클라이언트

systemctl enable --now mariadb

firewall-cmd --add-service=mysql

/var/lib/mysql - mysql 관련 파일 디렉토리

기본 보안 설정

mysql_secure_installation - 간단 보안 설정 진입

설정 파일

  • /etc/my.cnf - 메인 설정 파일
  • /etc/my.cnf.d - 서브 설정 디렉토리
    • 보통 서브 설정을 통해 설정
    • /etc/my.cnf.d/mariadb-server.cnf … 등
    • [mysqld] 섹션
      • 로컬 접속만 허용 : skip-networking = 1
      • 특정 호스트만 접근 : bind-address = IP

SQL 쿼리

  • 접속 - mysql -u root -h localhost -p
    • u : 유저명
    • h : 호스트
    • p : 패스워드
  • SELECT col1, col2.. FROM db.table WHERE col1=condition;
  • INSERT INTO db.table (col1, col2, …) VALUES (val1, val2, …);
  • UPDATE db.table SET col1=val WHERE col1=condition;
  • DELETE FROM db.table WHERE col1=condition;
  • CREATE
    - CREATE USER ‘user1@localhost’;
    - CREATE DATABASE ‘test_db’;
    - CREATE TABLE table1 (
    												id int,
    												username varchar(10) not null,
    												primary key(num)
    											);
  • ALTER - DB 또는 테이블의 정보를 수정
    • ALTER TABLE table1 ADD age int not null;
    • ALTER TABLE table1 DROP age;
  • DROP - 객체 삭제
    • DROP TABLE table1;
  • GRANT - 권한 부여
    • GRANT 권한 ON object TO 대상;
    • GRANT select, insert ON db1.table1 TO user01@localhost;
  • REVOKE - 권한 제거
    • REVOKE 권한 ON object TO 대상;
    • REVOKE select ON db1.table1 TO user01@localhost;
  • COMMIT
  • ROLEBACK

SQL 실습

  • 접속 - mysql -u root -h localhost -p
  • DB 확인 - show databases;
  1. 데이터베이스 서버 생성
    1. CREATE database db1;
    2. CREATE DATABASE database_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
      1. 한글 적용
  2. 데이터베이스 테이블 생성
    1. DB : sesac
    2. TABLE : student
    3. COL
      1. id : int, AUTO_INCREMENT, PRIMARY KEY
      2. name : varchar(10)
      3. age : int, not null
      4. address : varchar(30)
    4. 작업 DB 전환 - USE db1;
    5. 테이블 확인 - SHOW tables;
    6. 테이블 생성 - CREATE TABLE tb1 (id int AUTO_INCREMENT PRIMAMRY KEY, NAME VARCHAR(10), age int not null, address VARCHAR(30));
  3. 테이블 데이터 입력
    1. INSERT INTO db1.tb1(id, name) VALUES (2, "choi");
    2. ALTER DATABASE database_name DEFAULT CHARACTER SET utf8mb4;
      1. INSERT 시 한글이 적용 안됐을 때
    3. INSERT INTO db1.tb1(name, age, address) VALUES ("Jeong", 33, "서울 마포구");
  4. 사용자 생성 및 권한 부여
    1. viewer - 권한[조회], 호스트[모두]
      1. CREATE USER “viewer”@”%”; - @ = 모든 호스트 허용
      2. GRANT select ON db1.tb1 TO “viewer”@”%”;
    2. remover - 권한[삭제], 호스트[localhost]
      1. CREATE USER “remover”@”localhost” IDENTIFIED BY “1234”;
      2. GRANT delete ON db1.tb1 TO ‘remover’@’localhost’;
    3. 권한 정보 메모리 캐시 새로 고침 - FLUSH PRIVILEGES;
    4. MySQL 사용자 확인 - SELECT user, host FROM mysql.user;
  5. 사용자 전환 후 조회 작업
  6. MariaDB(=MySQL) 은 기본 설정일 경우 AUTO-COMMIT이 활성화 되어 있기 때문에 상황별로 ON/OFF 가 필요
    1. AUTO COMMIT 확인
      1. SELECT @@autocommit; - 1 = 활성화, 0 = 비활성화
    2. AUTO COMMIT 설정
      1. SET autocommit = TRUE; - TRUE / FALSE
  7. 웹서버를 통해 DB에 연결 할 때 아래와 같은 작업이 추가로 필요
    1. semanage boolean → httpd_can_network_connect_db → ON

MySQL 백업 및 복원

  • 물리적 백업
    • 속도는 빠르나 OS, DB버전, 하드웨어 사양 등에 민감
  • 논리적 백업
    • 논리적 파일로 변환해 백업하는 방법
    • 데이터베이스 설정까진 복원 불가
    • 저장된 데이터에 따라 백업 및 복원 시간이 오래 걸릴 수 있음
    • mysqldump [option] -u user-name -p database-name > file-path
      • —all-databases : 모든 DB 백업
      • —add-drop-databases : 복원 시 기존 DB를 삭제 후 복원
      • —add-drop-tables : 복원 시 기존 TABLE을 삭제 후 복원
      • —no-data : DB 의 데이터는 저장하지 않고 구조만 저장
      • —lock-all-tables : 백업 중 모든 테이블 잠금
    • 복원 방법 : mysql -u root -p db1 < test.dump
      • 복원 전 DB가 존재해야 오류가 나타나지 않는다.

DB 이중화

  • (MAIN/SUB) dnf install -y mariadb-server
  • (MAIN/SUB) systemctl enable —now mariadb
  • (MAIN/SUB) firewall-cmd —add-service=mysql
  • (MAIN/SUB) mysql_secure_installation - 초기 보안 설정 진입
  • (MAIN) /etc/my.cnf.d/mariadb-server.cnf
    • [mysqld] 섹션
    • autocommit=0
    • server-id=100 (=RANDOM)
    • log-bin=mysql-bin(=RANDOM)
  • (MAIN) systemctl restart mariadb
  • (MAIN) mysql -u root -h localhost -p
  • (MAIN) CREATE USER ‘rep_user’@’%’ IDENTIFIED BY “123”;
  • (MAIN) GRANT replication slave ON *.* TO ‘rep_user’@’%’;
    • replication slave = 복제 slave
    • . = 모든 DB, 모든 TABLE
  • (MAIN) SHOW master status;
    • FILE, POSITION 확인
  • (MAIN) mysqldump —all-datbases -u root -p > rep.dump
    • rep.dumb → SUB로 전달(scp 사용)
  • (SUB) /etc/my.cnf.d/mariadb-server.cnf
    • [mysqld] 섹션
    • autocommit=0
    • server-id=200 (=RANDOM, MAIN과 다르게)
    • log-bin=mysql-bin (=RANDOM)
    • read-only=1
  • (SUB) systemctl restart mariadb
  • mysql -u root -h localhost -p
    • CREATE database db1;
  • (SUB) mysql -u root -p << /tmp/rep.dump
    • 전체 DB 대상 복구는 DB명 생략 가능
  • CHANGE MASTER TO master_host='192.168.10.20', master_user='rep_user', master_password='123', master_log_file='mysql-bin.000002', master_log_pos=892;
  • start slave;
  • 이중화 확인
    • (MAIN) CREATE USER ‘seondo’@’%’ IDENTIFIED BY ‘123’;
    • (MAIN) GRANT ALL ON . TO ‘seondo’@’%’;
      • 모든 DB, 모든 TABLE의 모든 권한 부여
    • (CLIENT) mysql -u seondo -h 192.168.10.20 -p
    • (CLIENT) CREATE DATABASE db2;
    • (MAIN/SUB) db2 가 생성되었으면 OK
    • SUB에만 db2가 없는 경우
      • stop slave → 마스터 정보 갱신 → start slave 시 db2가 생성되어 있으면 OK

HA 프록시

  • 로드 밸런서
    • 서버의 장애 발생 가능성
    • 하나의 서버는 제한된 대역폭과 리소스를 가짐
    • 위 문제점을 해결하기 위해 서버의 앞단에서 사용자들을 분산시켜주는 장치 또는 서비스(L4)
    • 리버스 프록시 기능을 내재
  • 프록시
    • 프록시
      • 서버, 클라이언트 간의 중계서버
    • 리버스 프록시
      • 실제 서버 정보를 클라이언트에게 감춘다.
      • 클라이언트의 요청 엔드 포인트가 프록시 서버의 도메인이다.
      • 클라이언트에게 정확한 서버의 정보를 모르게 한 채로 일반적인 기능을 수행해 보안적으로 우수하다.
  • HA 프록시는 로드밸런서 기능을 할 수 있는 서비스의 하나

실습

구성 : 1 - web1 / 2- web2 / 3 - proxy

  1. dnf install -y haproxy
  2. /etc/haproxy/haproxy.cfg - 설정 파일
    1. global
      1. ssl-default-* : SSL 관련 옵션
    2. defaults
      1. mode : http(WEB SERVICE), TCP(DB.. etc), UDP
    3. frontend
      1. frontend = 프록시 서버
      2. bind : 허용할 ip와 port ( SSL/TLS 라면 443)
      3. acl : 파일 및 위치 접근 제어
      4. default_backend : 백엔드 이름 지정
    4. backend
      1. static 백엔드는 frontend의 acl 처리 전용 벡엔드
      2. 프록시 서버를 거쳐갈 실제 서버
      3. balance : roundrobin 같은 분산 방식을 결정
      4. server : 실제 웹 서버의 명칭과 ip, port를 설정
  3. systemctl enable —now haproxy.service
    1. 실습 시 80포트를 httpd와 haproxy가 공유하기 때문에 문제가 생길 경우 httpd 서비스를 중단 후 haproxy 서비스를 실행 시키면 잘 될 것
  4. firewall-cmd —add-port=80/tcp
  5. 테스트는 proxy 서버로 요청 시 실제 web1, web2 의 응답이 번갈아 나오면 성공

  1. mkfs 를 실행 후 블록 장치에 부여되며 항상 고정된 값
  2. 다수의 권한을 묶어 놓은 그룹

0개의 댓글