재형이의 성장통 일지
  • 리눅스 운영의 기초 : 파일시스템, 소프트웨어 및 사용자 관리
    2024년 01월 22일 07시 11분 55초에 업로드 된 글입니다.
    작성자: 재형이
    반응형
    • 지난번에 이어서 리눅스 기초 정리

     

    리눅스 운영의 기초 포스팅

     

    리눅스 운영의 기초 : 시스템 및 프로세스 관리

    운영을 잘하기 위해서는 운영체제의 기본 정도는 알고 있어야 할 것 같다는 생각이 들어서 리눅스를 공부하게 되었다 너무 딥하게 들어가지는 않을 것이고 기초 위주로 정리를 해볼 생각이다.

    jaehyeong.tistory.com

     

    리눅스 운영의 기초 : 파일시스템, 소프트웨어 및 사용자 관리

    지난번에 이어서 리눅스 기초 정리 1. 파일 시스템 (파일 시스템 이해, 마운트, 디렉토리 구조 등) 1-1. 파일 시스템 스토리지 장치에 파일을 명명하고, 저장하고, 읽어내는 방법을 제공하는 시스

    jaehyeong.tistory.com

     

    리눅스 운영의 기초 : 스크립트 및 설정 자동화

    리눅스 쉘 스크립트 및 IaC 도구 중 하나인 Ansible 기초 정리 리눅스 운영의 기초 포스팅 😎 리눅스 운영의 기초 : 시스템 및 프로세스 관리 리눅스 운영의 기초 : 시스템 및 프로세스 관리 운영을

    jaehyeong.tistory.com

     


     

    1. 파일 시스템 (파일 시스템 이해, 마운트, 디렉토리 구조 등)

    1-1. 파일 시스템

        • 스토리지 장치에 파일을 명명하고, 저장하고, 읽어내는 방법을 제공하는 시스템
        • file -s 명령어로 확인 가능
          sudo file -s /dev/xvdf
          → 파일시스템이 아직 없는 경우 → /dev/xvdf: data 출력
        • 파일 시스템 생성 명령어 : sudo mkfs
          ex) sudo mkfs -t ext4 /dev/xvdf 
        • 파일 시스템 역할
          • 공간 관리 : 스토리지 장치에 저장되는 방식을 관리.
            예) 하드 디스크 고려한 파일 시스템 → 파편화 관리 (seek time, rotational time)
          • 파일 이름 관리 : 이름 길이, 특수 문자, 대소문자 구분 등
            예) 길이제한: exFAT UTF-16 255자, ext4 255 바이트
          • 디렉토리 관리 : 파일을 포함하는 디렉토리 정보를 관리
            예) 부모 디렉토리 정보를 참고하여 블록 배치에 활용
          • 메타 데이터 관리 : 파일 길이, 권한, 디바이스 타입, 수정 시간, 기타 속성들
          • 장애 관리 : 시스템 장애 시 파일 유실 방지
            예) 저널링: 메타 데이터나 데이터의 로그를 저장)
            예) 디스크 해제 기능 실행 후 usb 메모리를 제거
        • → 파일시스템 설계 목적이나 스토리지 장치 및 워크로드에 맞게 다양한 파일 시스템 존재
          예) XFS : 빠른 복구, 빠른 트랙잭션, 큰 볼륨 지원 등
        • 리눅스의 파일 시스템은 크게 다음과 같이 분류
          1. 디스크 기반 파일 시스템
            • 시스템에 연결된 로컬 디스크나 SSD 등을 관리 파일시스템
            • EXT3, EXT4, ZFS, BTRFS 등 (Linux), FAT (Windows), NTFS (Windows), HFS(MacOS), APFS(MacOS)
          2. 네트워크 파일 시스템
            • 네트워크로 연결된 다른 컴퓨터의 파일 시스템에 있는 파일을 쉽게 접근하도록 지원
              → 로컬 디렉토리에 마운트 하여 사용
            • 여러 서버가 동시에 파일 시스템을 접근 가능
            • NFS, SMB, CIFS(Windows) 등
          3. 특수 파일 시스템 (가상 파일 시스템)
            • 실제 디스크 공간을 관리하지 않음
            • proc, sysfs , tmpfs, cgroup 등

    1-2. 마운트와 언마운트

        • 파일 시스템 마운트 명령어
          sudo mount /dev/sda1 /usr
        • 마운트된 모든 파일 시스템 확인
          mount
        • /etc/fstab에 있는 설정 모두 마운트하기
          mount -a
        • 시스템에 기본 마운트되는 파일 시스템 정보는 /etc/fstab 파일에 저장
        • 마운트를 진행했어도 fstab에 추가되지 않으면, 재부팅 시 자동으로 마운트가 안됨
        • 운영환경에서는 반드시 fstab에 마운트 정보 추가
        • fstab 파일 내용 구성 예 (EC2 Ubuntu20.04)
        • <파일 시스템> <마운트 포인트> <타입> <옵션> <덤프> <패스>
          LABEL=cloudimg-rootfs / ext4 defaults,discard 0 1
        • LABEL 라벨 확인하는 방법
    LABEL???
    $ blkid
    /dev/xvda1: LABEL="cloudimg-rootfs" UUID="436cf32d-5e3d-46ca-b557-f870c8a25794" TYPE="ext4" PARTUUID="24ca9e81-01”
    
    // 마운트 옵션
    - defaults = rw 모드
    - discard = 블록이 해제될 때 discard/trim명령 수행 → SSD 스토리지의 경우 사용
    (SSD의 경우 파일 시스템에서만 삭제하는 것이 아니라, SSD내에서도 삭제 표시(TRIM)를 해야지 GC과정에서 불필요한 내부 쓰기가 발생하지 않음)
    
    // 덤프와 패스 옵션
    - 덤프: 파일 시스템 백업 덤프 여부 → 0: 덤프 하지 않음
    - 패스: 파일 시스템 체크 여부/파일 시스템 체크 순서 → 0: 체크 하지 않음, 
    0은 체크하지 않음을 의미하며, 1은 루트 파일 시스템을, 2 이상은 루트 파일 시스템이 아닌 다른 파일 시스템을 체크하도록 지시합니다. 체크 순서가 낮은 파일 시스템부터 체크가 이루어집니다.
        • blkid 명령어로 UUID도 확인할 수 있으며 마운트시 UUID를 사용하여 장치를 지정하면, 디스크가 시스템에 다른 순서로 연결되더라도 항상 동일한 장치가 마운트되는 것을 보장할 수 있습니다.
        • 파일 시스템 언마운트 명령어
          umount
        • 파일 시스템이 해당 마운트 포인트를 사용중일 경우 언마운트가 실패함, 해결 방법
          1. 파일 시스템을 사용중인 프로세스 확인
            • fuser -cv 마운트 포인트 또는 lsof  | grep 마운트 포인트
          2. 프로세스 종료
            • kill -15 PID
            • kill -9 PID
          3. 언마운트 진행
            • umount 마운트 포인트

    1-3. 리눅스 디렉토리 구조

        • 파일 시스템 구조 표준 (Filesystem Hierarchy Standard)
        • 리눅스 재단이 유지
        • 대부분의 배포판이 해당 관례를 따름
        • UNIX 시스템의 파일시스템 레이아웃 관례를 정의

    https://refspecs.linuxfoundation.org/fhs.shtml

     

    FHS Referenced Specifications

      Filesystem Hierarchy Standard Specifications Archive The FHS 3 Specification Series The FHS 3 specification brings the first update in years, aligning with current usage patterns. The FHS 3.0 Specification This is the final version of the FHS 3.0 specif

    refspecs.linuxfoundation.org

        • 주요 디렉토리
          • / : 기본 계층 모든 파일 시스템 계층의 기본인 루트 디렉토리
          • /bin : 모든 사용자를 위해 단일 사용자 모드에서 사용 가능해야 하는 명령어 바이너리 ex) cat, ls, cp
          • /sbin : 필수 시스템 바이너리 ex) init, ip, mount
          • /usr/bin : 대부분의 명령과 실행 파일
          • /opt : 선택 가능한 응용 소프트웨어 패키지
          • /usr/local : 로컬 소프트웨어나 환경설정 데이터
          • /etc : 시스템에 필수적인 시작 및 설정 파일 (바이너리 파일은 저장하지 않음)
          • /run : 실행 중인 프로그램을 위한 PID, socket등을 위한 디렉토리
          • /var/log : 시스템 로그 파일
          • /home : 사용자 홈 디렉토리
          • /tmp : 재부팅 시 삭제 될 수 있는 임시 파일
        • → 개인 작업 파일은 개인 홈 디렉토리에 저장 (예, /home/ubuntu)
          →  로컬 소프트웨어 설치 /usr/local, /opt
          →  로그 파일은 /var/log

    1-4. 파일 타입

        • file 명령어로 확인 가능
          ex) file /tmp, file /dev/tty0
        1. 일반 파일 (Regular Files)
          텍스트나 바이너리 데이터를 저장하는 가장 일반적인 파일 타입입니다. 문서, 이미지, 프로그램 실행 파일 등이 이에 해당합니다.
        2. 디렉토리 (Directories)
          다른 파일이나 디렉토리를 포함할 수 있는 컨테이너입니다. 디렉토리는 파일 시스템의 구조를 형성하는 데 사용됩니다.
        3. 블록 디바이스 파일 (Block Device Files) 생성 : mknod / 삭제 : rm
          하드 드라이브, SSD 등과 같은 블록 디바이스를 인터페이스하는 파일입니다. 블록 디바이스는 고정된 크기의 데이터 블록으로 데이터를 읽고 쓰는 특성을 가집니다.
          → 블록(보통 4KB) / 섹터(보통 512B) 단위로 데이터를 전송
            장치와 직접적인 통신은 디바이스 드라이버가 담당
        4. 문자 디바이스 파일 (Character Device Files) 생성 : mknod / 삭제 : rm
          키보드나 마우스, 프린터 같은 문자 디바이스에 대한 인터페이스를 제공합니다. 문자 디바이스 파일은 데이터를 한 번에 한 문자씩(1바이트) 스트리밍하는 방식으로 처리합니다.
            byte 단위로 데이터를 전송
            장치와 직접적인 통신은 디바이스 드라이버가 담당
        5. 링크 (Links) : 다른 파일이나 디렉토리를 가리키는 포인터 역할을 하는 파일입니다, ls -i 로 inode 확인 가능

          1. 하드 링크 (Hard Link) : 원본 파일에 대한 직접적인 참조 (동일한 inode)
            생성: ln TARGET LINK_NAME
            삭제: rm
          2. 심볼릭 링크 (Symbolic Link) :  원본 파일의 경로를 저장하고, 해당 경로로 리디렉션하는 파일
            생성: ln -s TARGET LINK_NAME
            삭제: rm
        6. FIFO (Named Pipes)
          프로세스 간 통신(IPC)에 사용되는 파일 타입으로, 한 프로세스가 데이터를 넣으면 다른 프로세스가 데이터를 읽을 수 있는 파이프 역할을 합니다.
        7. 소켓 (Sockets) 생성 : socket 시스템콜 / 삭제 : rm, unlink 시스템콜
          네트워킹을 통한 프로세스 간 통신에 사용되는 파일 타입입니다. 소켓을 통해 프로세스는 네트워크를 통해 데이터를 전송하고 수신할 수 있습니다.
          1. 로컬 도메인 소켓 (유닉스 도메인 소켓)
            • 같은 호스트 내에서 프로세스 간 통신을 위해 사용되는 소켓 타입입니다
            • 네트워크 레이어를 거치지 않기 때문에 TCP/IP 소켓에 비해 낮은 오버헤드를 가지며 더 빠른 통신이 가능합니다
          2. TCP 소켓
            • 네트워크를 통한 프로세스 간 통신에 사용되는 소켓 타입입니다
            • 데이터를 전송할 때 IP 주소와 포트 번호를 사용하여 소켓을 식별하고 통신합니다
            • 네트워크를 통한 통신이 필요할 때 사용되며, 원격 호스트와의 통신에 적합합니다

    1-5. 사용 권한

        • 실행 동작과 관련된 3개의 추가적인 권한 (setuid, setgid, stickey bit)
          1. setuid: 해당 파일 소유자의 권한을 잠시 사용. User권한에 s 표시
          2. setgid: 해당 파일의 그룹 권한을 잠시 사용. Group권한에 s 표시
          3. stickey bit: 특정 디렉토리를 자유롭게 사용. 소유자만 파일 삭제하거나 변경 가능
        • 파일의 목록과 검사
          • ls -l : 상세 정보 포함한 파일 목록
          • ls -a : 숨긴 파일 표시 (예, .bashrc)
          • ls -t : 마지막 수정 시간 기준으로 목록 조회 (역순 -tr)
          • ls -h : 사람이 읽기 편한 형태로 출력 (예, 4.0K)
          • 조합하여 사용 가능
            ls -lht
        • chmod 명령어로 사용 권한 변경 가능 (파일 소유자나 슈퍼 유저만 가능)

        • chmod 711 filename
          사용자: 7은 2진수 111 → 모든 권한
          그룹 : 1은 2진수 001 →  실행 권한
          그 외 : 1은 2진수 001 → 실행 권한
        • chmod u+w → 파일 소유자에게 쓰기 권한 부여
        • chmod u-w → 파일 소유자에게 쓰기 권한 제거
        • chmod ug=rw, o=r → 소유자와 그룹에 읽기/쓰기 권한 부여, 기타 사용자에게는 읽기 권한만 부여
        • 파일 소유권과 그룹 변경
        • chown 명령으로 파일의 소유권 변경
        • chgrp 명령으로 그룹 소유권을 변경
        • →  chown 명령으로 둘 다 변경도 가능
          chown user:group FILENAME

    1-6. 디스크별/디렉토리별 스토리지 사용량 조회하는 명령어

        • 디스크별 용량 확인 명령어
          • df # 남은 용량 확인
          • df -h # 사람이 읽기 편한 형식으로 표시
          • df . # 현재 디렉토리가 포함된 디스크/파티션 공간의 남은 용량 확인
        • 디렉토리별 용량 확인 명령어
          • du # 현재 디렉토리에서 하위 디렉토리까지 사용량
          • du -a # 파일 크기가 0인 것(pseudo file)까지 모두 확인
          • du -s # 지정한 디렉토리 내에 존재하는 파일 및 디렉토리의 합
          • du -h # 가독성 좋게 표시
          • df -d 1 # 1 depth 디렉토리까지 용량 확인
        • 예시 1) 홈 디렉토리 사용량 조회해보기
          • du -sh /home/ubuntu # 전체 사용량 조회
          • du -h -d 1 /home/ubuntu # Depth 1 로 홈 디렉토리 사용량 조회
          • du -h -d 1 /home/ubuntu | sort -h -r # 조회 결과를 크기 역순으로 조회
        • 예시 2) 루트 디렉토리에서 사용량 크기 역순으로 조회
          • du -h -d 1 / 2> /dev/null | sort -h -r | head -n 20
          • du -h -d 1 /var 2> /dev/null | sort -h -r | head -n 20
          • 표준 에러 출력을 /dev/null로 리다이렉션하여 출력하지 않게 함

    1-7. LVM (Logical Volume Manager)

        • 여러 개의 디스크 공간을 하나로 합쳐서 관리
          예) /dev/sda + /dev/sdb + /dev/sdc
          → 작은 디스크를 모아서 대용량 스토리지 구성 가능
        • 사용할 때는 Logical Volume으로 나누어 필요한 만큼 할당 가능
          예) 20기가 크기의 Logical Volume 생성
          → 스토리지 확장 및 변경에 유연하게 대처 가능

     

        • 기본적인 논리 볼륨 생성해서 마운트
          1. 부착한 볼륨에 파일 시스템 생성하기 전에 physical Volume 생성하기
            sudo file -s /dev/xvdf
            # /dev/xvdf: data
            
            sudo pvcreate /dev/xvdf
            # Physical volume "/dev/xvdf" successfully created.
            
            sudo pvs
            # PV        VG  Fmt   Attr  PSize   PFree
            # /dev/xvdf     lvm2  ---   10.00g  10.00g
          2. Volume Group 생성 및 PV 그룹에 추가
            sudo vgcreate Data /dev/xvdf
            # Data 생성할 볼륨 그룹 이름
            
            sudo vgs
            # VG     #PV  #LV   #SN Attr    VSize    VFree
            # Data     1    0     0 wz--n-  <10.00g  <10.00g
          3. Logical Volume 생성 및 마운트 + 파일 시스템 생성
            sudo lvcreate -n data1 -L 9G Data
            sudo lvs
            sudo mkdir /data1
            sudo mkfs -t ext4 /dev/Data/data1
            lsblk -f
            sudo mount /dev/Data/data1 /data1
            
            #/etc/fstab
            /dev/Data/data1 /data1  ext4     defaults,nofail   0   2
        • 논리 볼륨 추가로 사용하기
          1. 물리 볼륨 생성 및 확인
            sudo pvcreate /dev/xvdg
            sudo pvs
          2. 볼륨 그룹 확장
            sudo vgextend Data /dev/xvdg
            sudo vgs
          3. 논리 볼륨 확장
            sudo lvextend -L +20G /dev/Data/data1
            sudo resize2fs /dev/Data/data1
        • 논리 볼륨 삭제하기
          1. 언마운트
            vim /etc/fstab
            sudo umount /data1
          2. 논리 볼륨 삭제
            sudo lvremove /dev/Data/data1
          3. 볼륨 그룹 삭제
            sudo vgremove Data
          4. 물리 볼륨 삭제
            sudo pvremove /dev/xvdf
            sudo pvremove /dev/xvdg

    2. 소프트웨어 설치 및 관리 (리눅스 패키지 시스템, 상위 레벨 패키지 관리 시스템 등)

        • 리눅스에서 전통적인 프로그램 설치 방식
          • 코드를 빌드해서 설치 후 사용
            wget https://nginx.org/download/nginx-1.20.1.tar.gz
            tar zxf nginx-1.20.1.tar.gz
            cd nginx-1.20.1
            ./configure
            make
            sudo make install
            → 빌드를 위한 각종 라이브러리 설치가 필요함. 직접 프로그램 실행 관리를 해야함.
        • 소프트웨어 관리 작업을 편하게 해주는 패키지 매니저 사용
          • 패키지 → 컴파일된 바이너리, 의존성 정보, 환경설정 템플릿 등 소프트웨어 실행에 필요한 모든 파일이 포함
          • 설치 실패의 경우, 설치 중이던 파일 삭제하거나 재시도 가능
          • 간편한 업데이트
          • 시스템 관리자가 수정한 지역화 작업을 덮어 쓰지 않음
            예) 대부분의 경우, 기존 환경설정 파일을 백업
            →  운영 환경에서는 설치 전에 사전 테스트를 진행하는 것이 좋음
          • 의존 모델 정의
            → 의존하는 라이브러리나 지원 인프라 확인 진행
            → 하지만 의존성들간의 버전 호환성 문제로 패키지 업데이트 불가능한 상태가 되기도 함
            예) 경우에 따라, 임베디드 환경구성에 Docker를 활용하기도 함

    2-1. 리눅스 패키지 관리 시스템

        • 저수준
          • RPM ← RedHat 계열(RedHat, CentOS, Amazon Linux 등)
            • 패키지를 설치, 검증, 패키지 상태 확인
            • 옵션
              -i: 설치, -U: 업그레이드, -e: 삭제, -q: 질의
              예) rpm -qa
              →  시스템에 설치된 모든 패키지 나열
              예) rpm -U 패키지명.rpm
              →  패키지 업그레이드 하지만, 종속성 관계로 실패하는 경우 많음
              (예, 다른 패키지 영향을 고려해 업그레이드를 허용하지 않음)
              →  --force 옵션으로 강제적인 업그레이드는 또 다른 문제를 발생…
          • deb ← Debian 계열(Debian, Ubuntu 등)
            • 데비안 패키지 설치
            • 옵션
              -l : 설치된 패키지 목록, --install: 설치, --remove: 삭제
              예) sudo dpkg --install 패키지명.deb
              예) dpkg -l cp* : cp로 시작하는 모든 패키지 조회
        • 고수준
          • 패키지를 찾아 다운로드하는 작업을 단순화 → 패키지 저장소가 존재
          • 시스템 업데이트나 업그레이드 과정 자동화
          • 패키지간 의존성 관리 간편화
          • yum ← RedHat 계열
            • yum install nginx
            • yum remove nginx
          • apt ← Debian 계열
            • 이전은 apt-get, apt-cache 명령 사용했지만, apt명령으로 주요 기능을 통합 → apt 사용
            • apt install -y nginx → 바이너리 다운로드 및 설치, 의존성 관리, 서비스 등록, 부팅 시 시작, 로그 로테이션 등
            • apt remove nginx
          • zypper ← SUSE 계열
            • zypper install nginx
            • zypper remove nginx

    2-2. 패키지 저장소 추가하기

        • 공식 저장소 외에 추가 저장소가 필요할 경우
          → 기본 저장소에 모든 프로그램이 다 존재 하지는 않음
          오래된 패키지 버전 (검증 절차)
          예) nodejs 기본 리포지토리: v10.19.0
                           →  NodeSource PPA: v16.6.1
          * PPA : Personal Package Archive
        • 저장소 추가 방법 (예시: Redis 저장소 추가)
          1. 저장소 키 추가
            curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archivekeyring.gpg
          2. 레포지토리 정보 추가
            echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb
            $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
          3. 저장소/패키지 업데이트
            sudo apt update
            sudo apt install redis
             
        • 운영 환경은 latest 버전이 아닌 특정 버전을 지정하여 사용 하는게 일반적임
        • Latest 버전은 시점에 따라 변경이 될 수 있음
        • 동일한 코드인데, 동작 시 오류가 발생할 수 있음
        • 종속성 최소화 및 버그 픽스를 고려해 버전을 명시

    3. 사용자 관리 (사용자 관리 이해, 새로운 사용자 추가 등)

    3-1. 리눅스 계정 모델

        • 전통적인 방식
          • 유닉스나 리눅스에서 사용되던 전통적인 계정 모델
             /etc/passwd, /etc/shadow, /etc/groups
        • 확장 방식
          • LDAP 이나 Active Directory 같은 디렉토리 서비스와의 통합
            → 통합 사용자 관리 (장점: 새로운 사용자 등록, 퇴사자 관리, 역할에 따른 권한 관리 등)

    3-2. 리눅스 계정 관리

        • 리눅스의 사용자 계정관리는 UID를 기준으로 동작
          → 사용자 ID(UID): 사용자를 식별하는 하나의 숫자 (부호 없는 32비트 정수)
          → UID를 사용자 정보로 매핑 하여 사용 à getpwuid(), getpwnam(), /etc/passwd 등으로 매핑
        • /etc/passwd 파일
          • 시스템이 인식하는 사용자들의 목록
          • 로그인명 : 암호화된 암호 : UID : GID : 사용자정보: 홈 디렉토리 : 로그인 쉘
            ubuntu : x : 1000 : 1000 : Ubuntu : /home/ubuntu : /bin/bash
            root : x : 0 : 0 : root : /root : /bin/bash
            daemon : x : 1 : 1 : daemon : /usr/sbin : /usr/sbin/nologin
          • 로그인명: 고유한 사용자 이름. 리눅스의 경우 32자로 제한, 콜론 및 개행 문자 포함 안됨 (배포판에 따라 다름)
          • 암호화된 암호 : /etc/shadow에 패스워드가 저장
          • UID: 루트 유저는 UID가 0 실제 사용자는 1000번 이상의 UID를 배정. UID는 재활용 되지 않음
            → 조직이 큰 경우, LDAP 권장
          • GID: 0은 root, system, wheel 그룹용으로 확보.
          • 홈 디렉토리 : 로그인 후 위치하는 디렉토리
          • 로그인 쉘:
            로그인한 사용자가 사용하게 될 쉘. chsh 명령으로 기본 쉘 변경 가능 (LDAP사용의 경우 chsh작동 안할 수 있음)
            pseudo 사용자의 경우 로그인이 안되도록 쉘에 /usr/sbin/nologin 설정
        • /etc/shadow 파일
          • /etc/passwd에는 제공되지 않는 추가적인 계정 정보를 포함
          • 슈퍼유저만 읽을 수 있는 권한이 있음
          • 암호를 저장하는 기본 위치로 사용됨
          • /etc/passwd, /etc/shadow 별도로 관리가 됨
            useradd 명령 → 두 파일에 모두 정보가 추가
            pwconv 명령 → 두 파일의 내용을 동기화
          • 내용
            로그인명 : 암호화된 암호 : 마지막으로 암호를 변경한 날짜 : 암호 변경을 위한 최소 날짜 수 : 암호 변경을 위한
            최대 날짜 수 : 암호가 만료되기 전에 미리 사용자에게 경고할 날짜 수 : 암호 만료 후에 계정을 비활성화할 날짜 수:
            암호 만료 후에 계정을 비활성화할 날짜 수 : 계정 만료 날짜 : 여분 필드
          • 암호화 정책 설정
            Ubuntu: /etc/pam.d/common-passwd
            RedHat: /etc/login.defs 또는 authconfig 명령 사용

    /etc/shadow 파일 내용

        • /etc/group 파일
          • 그룹명과 각 그룹의 멤버 목록을 포함
          • 내용
            그룹명 : 암호 : GID 번호 : 멤버 목록 (복수 사용자 등록시 ,로 구분하고 공백은 허용하지 않음)
          • /etc/passwd에 지정된 GID와의 관계
            합집합으로 적용됨. 모든 그룹 정보가 적용됨

    3-3. 리눅스 사용자 추가

        • useradd : 사용자 계정 생성
        • usermod : 사용자 계정 수정
        • userdel : 사용자 계정 삭제
    # 사용자 생성
    sudo useradd kjh
    
    # 추가 정보를 포함한 사용자 생성, m 옵션 : 사용자 홈 디렉토리 생성, s 옵션 : 로그인 쉘 지정
    sudo useradd -m -s /bin/bash kjh
    
    # 사용자 삭제, r 옵션 : 사용자와 관련된 디렉토리 모두 삭제 ex. 홈디렉토리, 메일풀
    sudo userdel kjh -r
        • m 옵션 vs d 옵션 : d 옵션은 홈 디렉토리 수동으로 지정할 때 이용, 대신 디렉토리가 이미 존재해야 함
        • 예시) sudo 사용자 추가해보기
    # 새로운 사용자 추가
    sudo useradd -m -s /bin/dash kjh
    
    # 비밀번호 설정
    sudo passwd helloworld
    
    # sudo 그룹에 추가 → sudo 사용자로 지정
    sudo usermod -G sudo kjh

     

    3-4. 서비스 어카운트 만들기

        • 보안 사고 방지를 위해 어플리케이션 구동 시 root 유저 사용을 하지 않고 서비스 어카운트를 만들어서 사용
    # 서비스 어카운트 생성, r 옵션 : 서비스 어카운트
    sudo useradd -r -s /usr/sbin/nologin jenkins
        • 만료 날짜 없이 생성
          만료 날짜 지정 : sudo usermod -e 2024-12-31 jenkins
        • 홈 디렉토리 생성하지 않음
          → 생성이 필요한 경우 -m 옵션을 추가
        • -s /usr/sbin/nologin
          → 쉘 접속을 허용하지 않음
        • 사용자 정보 확인하기
          • grep jenkins /etc/passwd /etc/shadow
          • ls /home | grep jenkins
        • 사용자 삭제
          • userdel jenkins -r
        • 참고) 컨테이너 구동 시 서비스 어카운트 사용하는 방법
    vim Dockerfile
    
    FROM ubuntu:20.04
    RUN groupadd -r app &&\
        useradd -r -g app -d /home/app -c "Docker image user" app
    USER app
    CMD ["sleep", "infinity"]

    Redis Dockerfile
    Nginx Dockerfile

    3-5. AWS 클라우드 환경 SSH 접근 시 MFA 인증 구성하여 보안 강화하기

        • Ubuntu 20.04 AWS EC2 사용
          1. google authenticator 패키지 설치
            sudo apt update
            sudo apt install -y libpam-google-authenticator
          2. MFA 앱 설치
            https://chromewebstore.google.com/detail/%EC%9D%B8%EC%A6%9D-%EB%8F%84%EA%B5%AC/bhghoamapcdpbohphigoooaddinpkbai
             

            인증 도구

            인증 도구는 브라우저에서 2단계 인증 코드를 생성합니다.

            chrome.google.com

          3. google authenticator 초기화
            google-authenticator
          4. PAM(Pluggable Authentication Module) 정보 백업
            sudo cp /etc/pam.d/sshd /etc/pam.d/sshd.bak
          5. google authenticator 관련 인증 정보 추가
            sudo vim /etc/pam.d/sshd
            
            # Standard Un*x authentication.
            #@include common-auth   # 주석처리
            
            # Standard Un*x password updating.
            @include common-password
            auth required pam_google_authenticator.so 
            auth required pam_permit.so
          6. sshd 설정 정보 백업
            sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
          7. sshd 설정 정보 변경
            sudo vim /etc/ssh/sshd_config
            
            # Change to yes to enable challenge-response passwords (beware issues with
            # some PAM modules and threads)
            ChallengeResponseAuthentication yes
            
            AuthenticationMethods publickey,password publickey,keyboard-interactive
          8. ssh 서비스 재시작
            sudo systemctl restart sshd.service
          9. ssh 연결 후 MFA 정보 확인

    3-6. AWS 클라우드 환경에서 SSH 접속할 공개키를 잃어버린 경우, 조치 방법

        • AWS SSM 사용해도 되지만, 공개키를 새로 생성해서 cloud-init으로 ssh_authorized_keys에 등록하는 방법
        • cloud-init 활용 방법
          1. 새로운 키페어 생성 및 다운로드
          2. 등록할 퍼블릭 키 생성
            chmod 400 new-ec2-key.pem
            ssh-keygen -y -f new-ec2-key.pem
          3. 인스턴스 중지 및 사용자 데이터 편집
            Content-Type: multipart/mixed; boundary="//"
            MIME-Version: 1.0
            
            --//
            Content-Type: text/cloud-config; charset="us-ascii"
            MIME-Version: 1.0
            Content-Transfer-Encoding: 7bit
            Content-Disposition: attachment; filename="cloud-config.txt"
            
            #cloud-config
            cloud_final_modules:
            - [users-groups, once]
            users:
              - name: ubuntu
                ssh_authorized_keys: 
                - PublicKeypair
          4. 인스턴스 시작
          5. 새로운 개인키로 서버 접근 및 cloud-init 실행 확인
            ssh -i new-ec2-key.pem ubuntu@IP_ADDRESS
            journalctl -b 0 -u cloud-init
          6. 보안을 위해 인스턴스 중지 & 사용자 데이터 삭제
          7. 인스턴스 시작

     


     

    마무리

      • 유용한 명령어 위주로 정리를 해두었고 마지막에는 cloud-init 활용하는 방법을 정리해두고 싶어서 추가를 했다
    반응형
    댓글