1. MinIO 다운로드

  • MinIO가 /usr/local/bin 아래에서 실행 될 수 있도록 /usr/local/bin으로 이동 후 MinIO을 다운 받음
    $ cd /usr/local/bin
    $ wget https://dl.min.io/server/minio/release/linux-amd64/minio
    $ chmod +x minio


2. minio.conf 설정

  • /etc 밑에 minio 폴더를 만든 다음, minio,.conf을 생성

    $ mkdir /etc/minio
    $ vi /etc/minio/minio.conf

  • /etc/minio/minio.conf 파일 내용

    $ vi /etc/minio/minio.conf
    MINIO_VOLUMES="/data"              # minio 의 파일들을 관리할 위치 (volumes)
    MINIO_OPTS="--address :9000"       # minio 서비스에 대한 연결 포트
    MINIO_ROOT_USER=root               # root
    MINIO_ROOT_PASSWORD=root           # root의 비밀번호
    MINIO_ACCESS_KEY= "minioadmin"     # minio 접속 아이디
    MINIO_SECRET_KEY= "minioadmin"     # minio 접속 비밀번호



3. Centos Systemd에 MinIO 서비스 등록

  • /usr/lib/systemd/system/ 디렉토리에 minio.service 설정

    $ vi /usr/lib/systemd/system/minio.service
    [Unit]
    Description=MinIO
    Documentation=https://docs.min.io
    Wants=network-online.target
    After=network-online.target
    AssertFileIsExecutable=/usr/local/bin/minio
    
    [Service]
    EnvironmentFile=/etc/minio/minio.conf
    ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
    ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
    
    # Let systemd restart this service always
    Restart=always
    
    # Specifies the maximum file descriptor number that can be opened by this process
    LimitNOFILE=65536
    
    # Disable timeout logic and wait until process is stopped
    TimeoutStopSec=infinity
    SendSIGKILL=no
    
    [Install]
    WantedBy=multi-user.target
    # Built for ${project.name}-${project.version} (${project.name})

  • Systemd에 MinIO 서비스 적용

    $ systemctl daemon-reload

4. MinIO Service 실행

  • MinIO service 실행 및 영구 실행 적용

    $ systemctl start minio.service
    $ systemctl enable minio.service

  • MinIO service 상태 확인

    $ systemctl status minio.service



5. MinIO에 접속

  • IP:9000 접속하면 MinIO UI가 출력


  • MinIO UI에 로그인하면 아래와 같이 접속


  • MinIO는 오픈소스로 제공되는 오브젝트 스토리지 서버
  • AWS S3와 호환되는 클라우드 스토리지를 구축할 수 있는 도구
  • MinIO는 Golang으로 제작되며, 단일 실행 파일 형태로 설치 방법이 매우 간단
  • MinIO에서 데이터 보호를 위해서 Erasure Code를 사용
  • MinIO의 기본 document URL : https://docs.min.io/docs/
  • MiniO의 Console 참고 URL : https://docs.min.io/minio/baremetal/console/minio-console.html

 

MinIO를 제공하는 3가지 형태의 도구

  1. MinIO Server
    • 클라우드 스토리지 서버(오브젝트 스토리지)를 구성 가능
  1. MinIO Client
    • MinIO Server, AWS S3, GCS 등에 연결하여 파일 업로드 및 관리 등의 기능을 제공
  1. MinIO Library
    • 개발자를 위하여 Golang, Java, Python 등 SDK를 제공하는 라이브러리

 

minIO의 성능

  • minIO는 빠른 객체 스토리지
  • 읽기 속도 : 183GB/s
  • 쓰기 속도 : 171GB/s

 

minIO의 확장성

  • minIO는 간단한 확장 모델을 사용
  • 여러개의 minIO 인스턴스를 하나의 클러스터로 묶고, 클러스터들은 다시 글로벌 네임스페이스를 생성하며 병합

 

minIO기능

1. Erasure Coding

  • minIO는 어셈블리 언어로 작성된 Erasure Coding을 통해 데이터를 보호
  • minIO는 Reed-Solomon 알고리즘을 사용 → 여러 블럭으로 쪼개진 데이터 중 많은 부분이 손실되어도 복구가 가능
  • minIO는 오브젝트 수준에서 데이터 복구가 가능

 

2. Bitort Protection

  • 디스크 드라이브는 노후화된 디스크, 물리적 충격, 펌웨어의 버그 등의 문제로 데이터가 부패할 수 있지만, 사용자는 문제를 인식하지 못 할 수 있음
  • 사용자가 인식하지 못하는 데이터 손실을 minIO는 해쉬 알고리즘을 통해서 쓰고 읽을 때의 데이터가 동일한지 검증

 

minIO의 Architecture

  • minIO는 클라우드 친화적으로 설계되었으며, 경량의 컨테이너로 구동이 가능
  • 컨테이너는 40MB이하의 바이너리 파일로 매우 가벼움

 

아키텍처 개념도

  • 여러 노드에 분산된 minIO를 하나로 묶어서 사용 → 어플리케이션 수준에서는 S3 API를 이용하여 자원 접근 가능
  • 클러스터 내부에 minIO간에는 RESTful API를 통해서 통신
  • minIO는 내부적으로 3개의 Layer로 구성
    1. S3 Lyaer : 대외적인 네트워크를 처리하는 영역
    2. Object Layer : Cache, Compression, Encryption, Erasure code, Bitrot와 같이 minIO 기능들을 수행하는 영역
    3. Storage Layer : File System과 직접적으로 통신하는 영역

CentOS ISO 파일

1. CentOS6 ISO 파일 → EOL 초과로 서비스 지원 만료

centos6.9 버전 : http://repos-va.psychz.net/centos/6.9/isos/x86\_64/
centos6.10 버전 : http://repos-va.psychz.net/centos/6.10/isos/x86\_64/

2. CentOS7 ISO 파일

CentOS7.4 버전 : http://repos-va.psychz.net/centos/7.4.1708/isos/x86_64/
CentOS7.5 버전 : http://repos-va.psychz.net/centos/7.5.1804/isos/x86\_64/
CentOS7.6 버전 : http://repos-va.psychz.net/centos/7.6.1810/isos/x86\_64/
CentOS7.7 버전 : http://repos-va.psychz.net/centos/7.7.1908/isos/x86\_64/
CentOS7.8 버전 : http://repos-va.psychz.net/centos/7.8.2003/isos/x86\_64/
CentOS7.9 버전 : http://repos-va.psychz.net/centos/7.9.2009/isos/x86\_64/

3. CentOS8 ISO 파일 → EOL 초과로 서비스 지원 만료

CentOS8.1 버전 : http://repos-va.psychz.net/centos/8.0.1905/isos/x86_64/
CentOS8.2 버전 : http://repos-va.psychz.net/centos/8.2.2004/isos/x86_64/
CentOS8.3 버전 : http://repos-va.psychz.net/centos/8.3.2011/isos/x86_64/
CentOS8.4 버전 : http://repos-va.psychz.net/centos/8.4.2105/isos/x86_64/


CentOS 버전의 EOL

1. CentOS6 EOL

  • 출시 → 2011년 7월 10일
  • EOL → 2020년 11월 30일 (9년)

2. CentOS7 EOL

  • 출시 → 2014년 7월 7일
  • EOL → 2024년 7월 7일 (10년)

3. CentOS8 EOL

  • 출시 → 2019년 9월 25일
  • EOL → 2021년 12월 31일 (2년 3개월)
  • 레드햇이 CentOS8 지원을 중단
  • 레드햇이 Fedora → CentOS Stream → RedHat Enterprise으로 레드햇 리눅스 리스 주기 변경
  • UEFI는 통합 확장 펌웨어 인터페이스(Unified Extensible Firmware Interface)의 줄임말
  • UEFI는 BIOS를 대체하기 위해 등장한 시스템으로 보안 부팅(Secure Booting)이 가능하며, BIOS에 비해서 더욱 큰 디스크 용량을 지원하고, 더욱 고급스러운 GUI를 제공함
  • 최근에 출시되는 컴퓨터 메인보드에는 기본적으로 UEFI가 탑재되어 출시
  • UEFI는 사용자 입장에서도 손쉽게 하드웨어를 조작할 수 있도록 해줌


기본 ISO 파일 다운

kickstart ISO 파일을 만들기 위한 기초 작업

  • kickstart 파일은 설치된 RHEL/CentOS의 /root 디렉토리에 있는 anaconda-ks.cfg란 파일을 이용하는 것이 가장 효율

  • OS를 설치할 때 설정한 시간대, 패키지, 네트워크, 디스크 파티션 등등의 내용이 모두 들어 있음

  • CDROM을 사용하여 킥스타트 설치를 실행 → 디스크의 최상위 디렉토리에 배치되어야 함

    $ pwd
    /root/kickstart_iso_file
    
    # os파일과 mount할 디렉토리 생성
    $ mkdir uefi_ios
    
    # 현재 /root/kickstart_iso_file 디렉토리 아래의 내용 확인
    $ ls
    uefi_iso  CentOS-7-x86_64-Minimal-2009.iso
    
    # centos7 iso 파일을 수정하기 위해 uefi_iso 디렉토리에 mount
    $ mount -o loop CentOS-7-x86_64-Minimal-2009.iso ueif_iso/
    mount: /dev/loop0 is write-protected, mounting read-only
    
    # loop 디바이스로 mount한 내용 확인
    $ df -h | grep loop
    /dev/loop0      973M  973M     0 100% /root/kickstart_iso_file/uefi_iso
    
    # mount한 기본 Centos7 내용 확인
    $ ls uefi_iso/
    CentOS_BuildTag  EULA  images    LiveOS    repodata              RPM-GPG-KEY-CentOS-Testing-7
    EFI              GPL   isolinux  Packages  RPM-GPG-KEY-CentOS-7  TRANS.TBL
    
    # 커스터마이징할 iso 이미지를 만들기 위한 디렉토리 생성 후 기본 Centos7 내용 복사
    $ mkdir kickstart_uefi_iso
    $ cp -a uefi_iso/. kickstart_uefi_iso/
    
    # kickstart ueif ISO 파일을 만들기 위한 기본 디렉토리 생성
    # cp 명령어 실행 후 반드시 확인 필요 → kickstart_uefi_iso 디렉토리 안에에 .discinfo, .treeinfo 파일이 정상적으로 복사 확인 必
    # 두 개의 파일이 없으면 CD-ROM 이미지가 없다는 메세지가 발생하면서 문제 생김
    $ ls -al kickstart_uefi_iso/
    total 116
    drwxr-xr-x 8 root root  4096 Nov  3  2020 .
    drwxr-xr-x 4 root root  4096 Nov  2 01:30 ..
    -rw-r--r-- 1 root root    14 Oct 30  2020 CentOS_BuildTag
    -rw-r--r-- 1 root root    29 Oct 27  2020 .discinfo
    drwxr-xr-x 3 root root  4096 Oct 27  2020 EFI
    -rw-rw-r-- 1 root root   227 Aug 30  2017 EULA
    -rw-rw-r-- 1 root root 18009 Dec 10  2015 GPL
    drwxr-xr-x 3 root root  4096 Oct 27  2020 images
    drwxr-xr-x 2 root root  4096 Nov  3  2020 isolinux
    drwxr-xr-x 2 root root  4096 Oct 27  2020 LiveOS
    drwxr-xr-x 2 root root 36864 Nov  3  2020 Packages
    drwxr-xr-x 2 root root  4096 Nov  3  2020 repodata
    -rw-rw-r-- 1 root root  1690 Dec 10  2015 RPM-GPG-KEY-CentOS-7
    -rw-rw-r-- 1 root root  1690 Dec 10  2015 RPM-GPG-KEY-CentOS-Testing-7
    -r--r--r-- 1 root root  2883 Nov  3  2020 TRANS.TBL
    -rw-r--r-- 1 root root   354 Oct 27  2020 .treeinfo
    
    # 리눅스에서 iso 파일을 만드는 패키지 설치
    $ yum install -y genisoimage

※ 루프 디바이스(loop device)

  • 파일을 실제 물리적으로 존재하는 블록 디바이스 처럼 접근 가능하도록 한 가상 장치


UEFI 버전 kickstart ISO 파일 생성

1. kickstart를 실행할 uefi_ks.cfg 파일 생성

  • uefi_ks.cfg는 OS 설치하면 생성되는 anaconda-ks.cfg 파일 내용을 변경해서 생성하면 됨

  • uefi_ks.cfg 파일의 위치는 kickstart_uefi_iso 디렉토리 바로 아래에 위치(kickstart_uefi_iso 디렉토리 최상단)

  • 비밀번호는 linux7890으로 임의 지정 → ISO 파일 만들면 초기 설정에서는 변경이 불가능(OS 재설치 후 변경하면 됨)

  • uefi의 경우 → fstype는 efi로 fstype으로 설정

    $ pwd
    /root/kickstart_iso_file
    
    $ vi kickstart_uefi_iso/uefi_ks.cfg
    #version=DEVEL
    # System authorization information
    auth --enableshadow --passalgo=sha512
    # CDROM
    install
    cdrom
    # Use graphical install
    graphical
    # Run the Setup Agent on first boot
    firstboot --enable
    ignoredisk --only-use=sda
    # Keyboard layouts
    keyboard --vckeymap=us --xlayouts='us'
    # System language
    lang en_US.UTF-8
    
    # Network information
    network  --hostname=localhost.localdomain
    
    # Root password
    rootpw --iscrypted $6$WuNr09tS$BqTZlg86ZAyWAxQ//HiH1LY1gPoHleiHuhLPrlvxy8pKAWv5J5xRKlP6BCVos/MvroIIbcQ7OQktD0I1y167E.
    # System services
    services --disabled="chronyd"
    # System timezone
    timezone Asia/Seoul --isUtc --nontp
    # System bootloader configuration
    bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda
    # Partition clearing information
    clearpart --all --initlabel --drives=sda
    # Disk partitioning information
    part /boot/efi --fstype="efi" --ondisk=sda --size=500
    part swap --fstype="swap" --ondisk=sda --size=32768
    part / --fstype="ext4" --ondisk=sda --grow
    
    %packages
    @^minimal
    @core
    kexec-tools
    
    %end
    
    %addon com_redhat_kdump --enable --reserve-mb='auto'
    
    %end
    
    %anaconda
    pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
    pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
    pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
    %end
    
    #  kickstart_uefi_iso 디렉토리 아래에 kickstart를 실행할 uefi_ks.cfg가 있음을 확인(iso 파일을 만들 디렉토리 최상단에 존재해야함)
    $ ls kickstart_uefi_iso/
    CentOS_BuildTag  EFI  EULA  GPL  images  isolinux  LiveOS  Packages  repodata  RPM-GPG-KEY-CentOS-7  RPM-GPG-KEY-CentOS-Testing-7  TRANS.TBL  uefi_ks.cfg

2. 생성한 uefi_ks.cfg 파일 검증

  • ks.cfg 파일을 검증 → 미리 검증함으로써 iso 파일 만들기 전에 시간 낭비를 비할 수 있음

  • 검증을 했는데 아무 값도 출력되지 않으면 ks.cfg 파일이 정상이라는 의미 → 에러 발생시 수정 옵션 확인 필요

    $ pwd
    /root/kickstart_iso_file
    
    # anaconda_ks.cfg 파일의 문법적 오류 확인 -> 위에서 만들었기에 해당 내용은 통과.... 만약 설치 안했을 경우 설치 필요
    $ yum install -y pykickstart
    
    # 검증 -> 출력 결과가 없어야 OK
    $ ksvalidator kickstart_uefi_iso/uefi_ks.cfg

3. OS 설치 할 때 기본 설정 BOOT MODE가 UEFI인 경우 uefi_ks.cfg 파일 설정을 적용 → grub.cfg 파일 변경

  • kickstart_uefi_iso//EFI/BOOT/grub.cfg 파일 내용 변경 혹은 추가 필요

  • ks=cdrom:/uefi_ks.cfg의 kickstart 파일을 읽음

  • grub.cfg는 UEFI가 OS 설치할 때 실행되는 화면

    $ pwd
    /root/kickstart_iso_file
    
    $ vi kickstart_uefi_iso/EFI/BOOT/grub.cfg
    set default="1"
    [..중략...]
    ### BEGIN /etc/grub.d/10_linux ###
    menuentry 'Install CentOS 7' --class fedora --class gnu-linux --class gnu --class os {
      linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 quiet
      initrdefi /images/pxeboot/initrd.img
    }
    menuentry 'Kickstart UEFI INSTALLATION by CDROM' --class fedora --class gnu-linux --class gnu --class os {
          linuxefi /images/pxeboot/vmlinuz ks=hd:cdrom:/uefi_ks.cfg
          initrdefi /images/pxeboot/initrd.img
    }
    menuentry 'Test this media & install CentOS 7' --class fedora --class gnu-linux --class gnu --class os {
          linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 rd.live.check quiet
          initrdefi /images/pxeboot/initrd.img
    }
    submenu 'Troubleshooting -->' {
          menuentry 'Install CentOS 7 in basic graphics mode' --class fedora --class gnu-linux --class gnu --class os {
                  linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 xdriver=vesa nomodeset quiet
                  initrdefi /images/pxeboot/initrd.img
          }
          menuentry 'Rescue a CentOS system' --class fedora --class gnu-linux --class gnu --class os {
                  linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 rescue quiet
                  initrdefi /images/pxeboot/initrd.img
          }
    }

4. ustom iso 이미지 만들기

  • kickstart_uefi_iso/ 디렉토리를 Centos7-Kickstart-Uefi-Install.iso 이름의 iso파일로 생성

  • 완료되면 Centos7-Kickstart-Uefi-Install.iso를 다운 받아서 사용하면 됨

    $ pwd
    /root/kickstart_iso_file
    
    $ mkisofs -r -T -J -V "Centos 7 Custom CD" -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -e images/efiboot.img   -boot-load-size 4 -boot-info-table -o ./Centos7-Kickstart-Uefi-Install.iso kickstart_uefi_iso/
    [..중략...]
    Total translation table size: 124656
    Total rockridge attributes bytes: 55185
    Total directory bytes: 92160
    Path table size(bytes): 140
    Max brk space used a1000
    528246 extents written (1031 MB)
    
    $ ls
    bios_iso  Centos7-Kickstart-Uefi-Install.iso  kickstart_bios_iso  kickstart_uefi_iso

  • 리눅스(linux) 서버에 무한정으로 로그인 시도를 할 경우, 언젠가는 보안이 풀릴 위험이 있음
  • 외부에서 무한정으로 로그인 시도할 경우, 최대시도 횟수 설정이 있다면 외부 위협을 어느 정도 벗어날 수 있음
  • 보안 설정에 필요한 pam_tally2 모듈
    1. pam_tally2 모듈은 접속 시도가 계속 틀릴 경우 횟수에 제한을 설정하여 일정 시간 동안 계정 잠금 상태로 설정
    2. pam_tally2 모듈은 대부분의 Linux 배포판에 이미 설치되어 있으며, PAM 패키지에 의해 제어


리눅스 최대 로그인 횟수 설정하기, pam_tally2.so 모듈 사용

  • 리눅스 일반 사용자 계정의 로그인 시도 액세스 설정을 구성하려면 /etc/pam.d/password-auth 파일에 설정 추가

  • /etc/pam.d/password-auth 파일을 열고 아래 설정 추가

    auth       required    pam_tally2.so   deny=5   unlock_time=1800   no_magic_root   reset
    account  required    pam_tally2.so   no_magic_root

  • /etc/pam.d/password-auth 파일의 추가 설정 설명

    1. deny=5 → 5회 시도 후 접근을 거부하고 사용자를 잠급
    2. unlock_time=1800 → 계정은 30분동안 잠김. (수동 잠금을 해제할 때까지 영구적으로 잠그려면 unlock_time를 제거)
    3. no_magic_root → root는 패스워드 잠금 설정하지 않음
    4. reset → 접속 시도 성공 시 실패한 횟수 초기화


리눅스 일반 계정 반복 실패 후 로그인 시도 횟수 확인

  • 새로운 계정을 만들어 로그인 실패시 위 설정한 /etc/pam.d/password-auth 파일 내용이 정상 동작하는지 테스트 확인

  • 새로운 test 계정 생성 후 비밀번호 반복해서 실패

  • test 계정이 더 이상 접속 실패 상태를 확인하기

    # test 계정 생성
    $ adduser test
    
    # 6회 비밀번호 실패 후 test 계정 접속 실패 상태 확인
    $ pam_tally2 -u test
    Login           Failures Latest failure     From
    test                6



리눅스 일반 계정 접속 횟수 초기화

  • test 계정이 반복 실패하여서 잠긴 경우 일시적으로 접속 불가

  • 필요에 따라 접속을 허용해야하는 경우 -r 옵션을 사용하여 리셋해줌

  • pam_tally2 명령어의 -r 옵션은 잠금 실패 리셋을 의미 → 초기화 후 로그인 실패 횟수가 0으로 변경 확인

    $ pam_tally2 -u test -r
    
    # 계정 초기화 확인
    $ pam_tally2 -u test
    Login           Failures Latest failure     From
    test               0

  • grep 명령어는 특정 파일에서 지정한 문자열이나 정규표현식을 포함한 행을 출력 → 들어오는 입력에 대해 주어진 패턴을 포함하는 줄들을 출력
  • grep 명령어는 tail이나 ls, find 등 다양한 명령어와 조합하여 응용 가능


AND 조건 사용법

  • 패턴들이 모두 포함된 줄들을 출력

1. grep 명령어에 AND를 사용하는 첫번째 방법 → grep을 여러번 사용

  • Pipe( | )를 이용해 여러번 사용
    $ iptables -L | grep -i 'DROP' | grep -i 'tcp dpt:snapenetio'
    DROP       tcp  --  anywhere             anywhere             tcp dpt:snapenetio

2. grep 명령어에 AND를 사용하는 두번째 방법 → grep에 -E옵션을 사용

  • DROP과 tcp dpt:snapenetio이 모두 포함된 줄을 출력 → 순서에 상관 없이 두 패턴이 동시에 포함된 줄들을 출력
  • .*을 사용하여 AND 사용
    # .*을 사용하여 AND를 표시
    $ iptables -L | grep -iE 'DROP.*tcp dpt:snapenetio'
    DROP       tcp  --  anywhere             anywhere             tcp dpt:snapenetio


OR 조건 사용법

  • 패턴들 중 하나라도 포함하고 있는 줄들을 출력

1. grep 명령어에 AND를 사용하는 첫번째 방법 → grep에 -e 옵션을 사용

  • DROP 또는 tcp dpt:snapenetio 중 하나라도 포함된 줄을 출력 → 순서에 상관 없이 두 패턴 중 하나만 있어도 출력
    $ iptables -L | grep -e 'DROP' | grep -e 'tcp dpt:snapenetio'
    ACCEPT     tcp  --  8.8.8.8                anywhere             tcp dpt:snapenetio
    ACCEPT     tcp  --  1.1.1.1                anywhere             tcp dpt:snapenetio
    DROP       tcp  --  anywhere             anywhere             tcp dpt:snapenetio
    DROP       tcp  --  anywhere             anywhere             tcp dpt:rxmon
    DROP       tcp  --  anywhere             anywhere             tcp dpt:fmtp
    DROP       tcp  --  anywhere             anywhere             tcp dpt:radan-http
    DROP       tcp  --  anywhere             anywhere             tcp dpt:jetdirect
    DROP       tcp  --  anywhere             anywhere             tcp dpt:websm
    DROP       all  --  anywhere             anywhere             /* kubernetes firewall for dropping marked packets */ mark match 0x8000/0x8000

2. grep 명령어에 AND를 사용하는 두번째 방법 → grep에 -E옵션을 사용

  • DROP 또는 tcp dpt:snapenetio 중 하나라도 포함된 줄을 출력 → 순서에 상관 없이 두 패턴 중 하나만 있어도 출력
  • Pipe( | )를 이용해 여러번 사용
    # 파이프라인( | )을 이용하여 OR 사용
    $ iptables -L | grep -E 'DROP|tcp dpt:snapenetio'
    ACCEPT     tcp  --  8.8.8.8                anywhere             tcp dpt:snapenetio
    ACCEPT     tcp  --  1.1.1.1                anywhere             tcp dpt:snapenetio
    DROP       tcp  --  anywhere             anywhere             tcp dpt:snapenetio
    DROP       tcp  --  anywhere             anywhere             tcp dpt:rxmon
    DROP       tcp  --  anywhere             anywhere             tcp dpt:fmtp
    DROP       tcp  --  anywhere             anywhere             tcp dpt:radan-http
    DROP       tcp  --  anywhere             anywhere             tcp dpt:jetdirect
    DROP       tcp  --  anywhere             anywhere             tcp dpt:websm
    DROP       all  --  anywhere             anywhere             /* kubernetes firewall for dropping marked packets */ mark match 0x8000/0x8000


NOT 조건 사용법 → grep 명령어에 -v 옵션을 사용

  • ACCEPT가 들어있는 줄은 모두 제거

  • 특정 패턴이 포함되지 않은 줄들을 출력

    $ iptables -L | grep -vi ACCEPT
    target     prot opt source               destination
    KUBE-EXTERNAL-SERVICES  all  --  anywhere             anywhere             ctstate NEW /* kubernetes externally-visible service portals */
    KUBE-FIREWALL  all  --  anywhere             anywhere
    DROP       tcp  --  anywhere             anywhere             tcp dpt:snapenetio
    DROP       tcp  --  anywhere             anywhere             tcp dpt:rxmon
    DROP       tcp  --  anywhere             anywhere             tcp dpt:fmtp
    DROP       tcp  --  anywhere             anywhere             tcp dpt:radan-http
    DROP       tcp  --  anywhere             anywhere             tcp dpt:jetdirect
    DROP       tcp  --  anywhere             anywhere             tcp dpt:websm
    
    target     prot opt source               destination
    KUBE-FORWARD  all  --  anywhere             anywhere             /* kubernetes forwarding rules */
    DOCKER-ISOLATION  all  --  anywhere             anywhere
    DOCKER     all  --  anywhere             anywhere
    
    target     prot opt source               destination
    KUBE-SERVICES  all  --  anywhere             anywhere             ctstate NEW /* kubernetes service portals */
    KUBE-FIREWALL  all  --  anywhere             anywhere
    
    Chain DOCKER (1 references)
    target     prot opt source               destination
    
    Chain DOCKER-ISOLATION (1 references)
    target     prot opt source               destination
    RETURN     all  --  anywhere             anywhere
    
    Chain KUBE-EXTERNAL-SERVICES (1 references)
    target     prot opt source               destination
    
    Chain KUBE-FIREWALL (2 references)
    target     prot opt source               destination
    DROP       all  --  anywhere             anywhere             /* kubernetes firewall for dropping marked packets */ mark match 0x8000/0x8000
    
    Chain KUBE-FORWARD (1 references)
    target     prot opt source               destination
    
    Chain KUBE-SERVICES (1 references)
    target     prot opt source               destination

참고 URL : https://twpower.github.io/173-grep-and-or-not

  • 디스크와 같이 물리적인 장치를 특정 디렉토리에 연결시켜 주는 것
  • Plug and Play 기능을 수동으로 실행해 주는 것
  • 로컬 장치(하드디스크, USB, CD, DVD) 뿐만 아니라 원격지(NFS, 삼바)까지 포함해서 시스템에 마운트 가능

1. mount 명령어 사용법

  • 경로
    /usr/bin/mount
  • 옵션 사용법
    $ mount [옵션] [장치명]


2. mount 옵션

mount 옵션 설명
-a 옵션 - /etc/fstab에 있는 모든 파일 시스템을 마운트 → 리눅스가 booting할 때 mount -a가 실행
-v 옵션 - 자세한 출력 모드
-f 옵션 - mount 테스트 → 시스템을 호출하지 않고 마운트할 수 있는지 점검
- v 옵션과 함께 사용하면 진행 사항을 자세하게 알 수 있음
-n 옵션 - /etc/mtab 파일에 쓰기 작업을 하지 않고 마운트 → /etc가 읽기 전용 파일시스템인 경우 사용
-r 옵션 - 읽기만 가능하게 마운트 → mount -o ro 디렉토리와 동일한 효과
-w 옵션 - 읽기/쓰기 모드로 마운트 → mount -o rw 디렉토리와 동일한 효과
-t 옵션 - 마운트할 파일시스템 유형을 명시적으로 지정
-o 옵션 - 플래그 뒤에 콤마로 분리한 옵션을 적어줌
-B 옵션 - 기존에 마운트되어 있는 파일 시스템을 다른 위치에 한번 더 마운트
-M 옵션 - 마운트되어 있는 파일 시스템의 마운트 지점을 다른 위치로 이동


3. mount 플래그 옵션

mount 플래그 옵션
설명
defaults - rw, suid, dev, exec, auto, nouser, async 속성을 모두 가짐
auto - 부팅시 자동 마운트
noauto - 부팅시 자동마운트 X
dev - 파일시스템 상의 문자, 블럭 특수 장치를 해석
nodev - 파일시스템 상의 문자, 블럭 특수 장치를 해석 X
exec - 바이너리 실행파일이 실행되는 것을 허용
noexec - 바이너리 실행파일이 실행되는 것을 허용 X
- /tmp 디렉토리와 같이 신뢰할 수 없는 사용자도 접근할 수 있는 경우에 보안 향상
suid - setuid, setgid 의 사용을 허용
nosuid - setuid, setgid의 사용을 거부
ro - 읽기 전용 (read-only)
rw - 읽기/쓰기 (read/write) 가능
async - 파일시스템에 대한 I/O 비동기화
sync - 파일시스템에 대한 I/O 동기화
user - 일반 계정 사용자들도 마운트 할 수 있게 허용
nouser - 일반 계정 사용자가 마운트할 수 없음 → root만 mount 가능
noatime - 파일 접근시간을 업데이트 X- 메일 스풀이나 로그와 같이 I/O가 많은 파일시스템에 유용
remount - 이미 마운트된 파일시스템을 다시 마운트
loop - 다운받은 리눅스 설치 CD 또는 라이브 CD를 마운트하는 경우 가상 파일시스템을 마운트
- 가상 파일시스템을 루프백 마운트이라고 하는 방법 사용
- iso 파일 혹은 img 파일을 사용하는 경우 o loop 사용


4. mount 예제

  • mount된 파일 시스템 목록 출력
    $ mount
    sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
    proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
    devtmpfs on /dev type devtmpfs (rw,nosuid,size=65614092k,nr_inodes=16403523,mode=755)
    securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
    tmpfs on /dev/shm type tmpfs (rw,size=66060288k)
    devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
    [... 아래 내용 생략]

  • 특정 파일시스템 유형을 가진 목록 출력 → t 옵션 사용
    $ mount -t ext4
    /dev/sda2 on / type ext4 (rw,relatime,stripe=64,data=ordered)
    /dev/sda1 on /boot type ext4 (rw,relatime,stripe=256,data=ordered)
    /dev/sdb1 on /cache1 type ext4 (rw,noatime,stripe=64,data=writeback)
    /dev/sdc1 on /cache2 type ext4 (rw,noatime,stripe=64,data=writeback)
    /dev/sdd1 on /cache3 type ext4 (rw,relatime,stripe=64,data=ordered)

  • /dev/sdd1 디바이스를 /cache1으로 mount → 자세한 정보 출력을 위해 v 옵션 사용
    $ mount -v /dev/sdd1 /cache3/
    mount: /dev/sdd1 mounted on /cache3.

  • 이미 마운트된 파일시스템을 다시 마운트 → o 옵션에 remount 사용
    $ mount -o remount /data

  • 마운트되어 있는 파일시스템을 다른 위치에 한번 더 마운트 → B 옵션을 사용하면 다른 위치를 마운트

    # 새로운 디렉토리 생성
    $ mkdir /cache10/
    $ mount -v -B /cache3/ /cache10/
    mount: /cache3 bound on /cache10.
    
    $ df -h
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sdd1       1.5T   77M  1.4T   1% /cache3
    
    # /dev/sdd1 장체에 2개의 디렉토리가 mount
    $ mount | grep /cache3
    /dev/sdd1 on /cache3 type ext4 (rw,relatime,stripe=64,data=ordered)
    $ mount | grep /cache10
    /dev/sdd1 on /cache10 type ext4 (rw,relatime,stripe=64,data=ordered)

  • CD 이미지파일(iso9660)과 USB 디스크 부트 이미지 파일을 시스템에 마운트

    # CD 이미지 파일(iso9660)을 시스템에 마운트
    $ mount -v -t iso9660 -o loop /root/image.iso /mnt/repo
    mount: going to use the loop device /dev/loop0
    /root/image.iso on /mnt/repo type ext3 (rw, loop=/dev/loop0)
    
    # USB 디스크 부트 이미지 파일을 시스템에 마운트
    $ mount -v -o loop /root/boot.img /mnt/repo
    mount: going to use the loop device /dev/loop0
    mount: you didn't specify a filesystem type for /dev/loop0
         I will try type vfat
    /root/boot.img on /mnt/repo type vfat (rw,loop=/dev/loop0)

참고 자료 : https://velog.io/@zoo81001/Linux-Mount-%EB%A7%88%EC%9A%B4%ED%8A%B8
참고 자료 : https://jhnyang.tistory.com/12

  • ALPN은 Application Layer Protocol Negotiation의 약어
  • ALPN(Application-Layer Protocol Interval)은 "Hello 메시지" 교환 내에 프로토콜 협상을 포함하는 TLS 확장
  • ClientHello의 확장 기능으로, TLS handshake 이후에 application layer의 프로토콜과 버전을 결정하기 위한 기능
  • ALPN → 프로토콜을 협상

    1. secure connection을 통해 처리
    2. 효율적인 접속
    3. 추가적인 round trips을 방지


  • HTTP/2 프로토콜은 ALPN을 사용하여 웹사이트 로딩 시간을 줄이고 연결을 더 빠르게 암호화함

  • 핸드셰이크 프로세스는 client에서 server까지 왕복 2회에 해당

  • round trips이 많을수록 대기 시간은 길어지고 사용자는 서버로부터 정보를 받기 위해 더 오래 기다려야 함

  • round trips의 수는 주로 client와 server(ex.. DNS, TCP, HTTP) 간의 통신을 시작하기 위한 핸드셰이크에서 발생

  • round trips이 적은 상태에서 데이터를 전송하는 프로토콜을 개선할 수 있다면, 페이지 로딩 시간도 개선 가능

  • ALPN은 HTTP/2에서는 HTTP의 버전을 합의하기 위해서 ALPN을 사용
    1. 먼저 client가 자신이 HTTP/1.1과 2를 지원한다는 사실을 ALPN으로 전송
    2. server가 ALPN과 HTTP/2를 지원한다면 ServerHello의 확장 필드에 h2를 적으면 handhshake 이후 HTTP/2로 통신이 시작
    3. ALPN을 지원하지 않으면, ServerHello에 ALPN 필드가 없으므로 HTTP/1.1로 통신


TLS handshake 동작 원리

  • ALPN 확장을 사용할 경우의 이점을 완전히 이해하기 위해서는 먼저 TLS 핸드셰이크가 어떻게 작동하는 지 숙지할 필요가 있음

1. TLS handshake 단계 (TLS 포함)

  1. client와 server는 "Hello 메시지"를 교환하여 알고리즘에 합의하고 랜덤 값을 교환(exchange random value)하며 세션 재개(session resumption)를 확인
  2. 필요한 암호 파라미터(cryptographic parameters)의 교환을 통해 client와 server가 premaster secret를 허용
  3. master secret은 premaster secret에서 생성되고 임의의 값을 교환
  4. record layer에 security parameters를 제공
  5. client와 server는 peer가 동일한 security parameters를 계산했는지, 공격자가 조작하지 않고 handshake가 발생했는지 확인

2. premaster secret

  • Client는 세션키를 생성하여 서버에게 전송
  • 암호화된 세션키를 premaster secret이라고 함

3. master secret

  • 서버측에서 복호화할 때 사용
  • premaster secret을 통해 master secret가 생성
  • premaster secret을 사용하여 master secret를 복호화 → 데이터 추출 가능


ALPN의 동작 원리

  1. ALPN client는 "TLS ClientHello 메시지"가 지원되는 application protocol 목록을 server로 전송 → "ClientHello 메시지" 안에 지원하는 목록을 가진 ProtocolNameList 필드를 추가
  2. 목록을 수신한 server는 프로토콜을 선택하고 "ServerHello 메시지"로 프로토콜을 다시 전송 → 수신한 ProtocolNameList 필드를 살피고 "SeverHello 메시지"의 일부에 선택된 프로토콜을 나타내는 ProtocolName 필드를 반환
  3. Server는 하나의 프로토콜 명을 응답하겠지만, 만약 Client가 요청한 목록에서 지원되는 것이 없다면 연결은 끊어지게 됨
  4. 일단 TLS hadnshake가 완료되면 보안 연결이 수립되고 Client 와 Server는 어떤 응용프로그램 프로토콜을 사용할지 동의
  5. 협상된 프로토콜을 통해 Client와 Sever는 바로 메시지를 교환 가능
  6. aplication protocol negotiation은 TLS handshake 내에서 하나의 round trip에서 달성
  7. 위 방법은 server가 각 application protocol에 다른 인증서를 연결할 수 있도록 함
  8. support protocols 목록은 first message에서 server로 전송되어 필요한 왕복 여행의 양을 최소화


NPN vs ALPN (NPN과 ALPN의 비교)

1. NPN(client가 프로토콜 선택)

  • Next Protocol Negotiation의 약어
  • TLS Handshake 중에 효과적인 응용프로그램 프로토콜 협상을 위해서 구글에서 개발한 SPDY의 일부로 개발된 TLS 확장
  • NPN은 ALPN의 전신이며 SPDY와 함께 널리 사용 (ALPN과 상당히 유사)
  • NPN은 "ClientHello 메시지"에 지원되는 프로토콜 목록을 포함 X → ALPN과 차이
  • NPN extension에서는 "ClientHello 메시지"에 프로토콜 목록이 포함되지만 일반적인 NPN은 client가 선택할 수 있는 프로토콜 목록을 다시 보내는 것은 server이다.

2. ALPN (server가 프로토콜 선택)

  • NPN을 업그레이드 한 버전(client와 server의 프로토콜 목록 전송은 반대 과정)
  • ClientHello 메시지는 server가 선택할 수 있도록 지원되는 프로토콜 목록을 포함
  • ALPN은 "ClientHello 메시지"를 받은 이후 리소스 선택 프로세스(resource selection process)를 시작할 수 있어 역방향 프록시(reverse proxy)에도 유리
  • ALPN이 다른 프로토콜 협상 표준과 더 유사


ALPN의 성장

  • HTTP/2는 사용자 경험 향상(better user experience)과 로딩 시간 단축(faster load times)으로 인기가 높아짐 → ALPN 확장이 HTTP/2와 결합하여 제공됨으로 ALPN도 같이 성장
  • 2016년 SPDY가 공식 폐지되면서 HTTP/2의 성장이 두드러짐
  • 인상적인 속도 및 강화된 보안 기능으로 ALPN 발전
  • 웹 사이트에서 HTTP/2 및 ALPN을 지원하는지 확인 : https://gf.dev/http2-test


참고 자료 : https://www.ietf.org/proceedings/88/slides/slides-88-httpbis-1.pdf

+ Recent posts