방명록
- 리눅스 운영의 기초 : 파일시스템, 소프트웨어 및 사용자 관리2024년 01월 22일 07시 11분 55초에 업로드 된 글입니다.작성자: 재형이반응형
- 지난번에 이어서 리눅스 기초 정리
리눅스 운영의 기초 포스팅
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 : 빠른 복구, 빠른 트랙잭션, 큰 볼륨 지원 등 - 리눅스의 파일 시스템은 크게 다음과 같이 분류
- 디스크 기반 파일 시스템
- 시스템에 연결된 로컬 디스크나 SSD 등을 관리 파일시스템
- EXT3, EXT4, ZFS, BTRFS 등 (Linux), FAT (Windows), NTFS (Windows), HFS(MacOS), APFS(MacOS)
- 네트워크 파일 시스템
- 네트워크로 연결된 다른 컴퓨터의 파일 시스템에 있는 파일을 쉽게 접근하도록 지원
→ 로컬 디렉토리에 마운트 하여 사용 - 여러 서버가 동시에 파일 시스템을 접근 가능
- NFS, SMB, CIFS(Windows) 등
- 네트워크로 연결된 다른 컴퓨터의 파일 시스템에 있는 파일을 쉽게 접근하도록 지원
- 특수 파일 시스템 (가상 파일 시스템)
- 실제 디스크 공간을 관리하지 않음
- 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 - 파일 시스템이 해당 마운트 포인트를 사용중일 경우 언마운트가 실패함, 해결 방법
- 파일 시스템을 사용중인 프로세스 확인
- fuser -cv 마운트 포인트 또는 lsof | grep 마운트 포인트
- 프로세스 종료
- kill -15 PID
- kill -9 PID
- 언마운트 진행
- umount 마운트 포인트
- 파일 시스템을 사용중인 프로세스 확인
1-3. 리눅스 디렉토리 구조
- 파일 시스템 구조 표준 (Filesystem Hierarchy Standard)
- 리눅스 재단이 유지
- 대부분의 배포판이 해당 관례를 따름
- UNIX 시스템의 파일시스템 레이아웃 관례를 정의
https://refspecs.linuxfoundation.org/fhs.shtml
- 주요 디렉토리
- / : 기본 계층 모든 파일 시스템 계층의 기본인 루트 디렉토리
- /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 - 일반 파일 (Regular Files)
텍스트나 바이너리 데이터를 저장하는 가장 일반적인 파일 타입입니다. 문서, 이미지, 프로그램 실행 파일 등이 이에 해당합니다. - 디렉토리 (Directories)
다른 파일이나 디렉토리를 포함할 수 있는 컨테이너입니다. 디렉토리는 파일 시스템의 구조를 형성하는 데 사용됩니다. - 블록 디바이스 파일 (Block Device Files) 생성 : mknod / 삭제 : rm
하드 드라이브, SSD 등과 같은 블록 디바이스를 인터페이스하는 파일입니다. 블록 디바이스는 고정된 크기의 데이터 블록으로 데이터를 읽고 쓰는 특성을 가집니다.
→ 블록(보통 4KB) / 섹터(보통 512B) 단위로 데이터를 전송
→ 장치와 직접적인 통신은 디바이스 드라이버가 담당 - 문자 디바이스 파일 (Character Device Files) 생성 : mknod / 삭제 : rm
키보드나 마우스, 프린터 같은 문자 디바이스에 대한 인터페이스를 제공합니다. 문자 디바이스 파일은 데이터를 한 번에 한 문자씩(1바이트) 스트리밍하는 방식으로 처리합니다.
→ byte 단위로 데이터를 전송
→ 장치와 직접적인 통신은 디바이스 드라이버가 담당 - 링크 (Links) : 다른 파일이나 디렉토리를 가리키는 포인터 역할을 하는 파일입니다, ls -i 로 inode 확인 가능
- 하드 링크 (Hard Link) : 원본 파일에 대한 직접적인 참조 (동일한 inode)
생성: ln TARGET LINK_NAME
삭제: rm - 심볼릭 링크 (Symbolic Link) : 원본 파일의 경로를 저장하고, 해당 경로로 리디렉션하는 파일
생성: ln -s TARGET LINK_NAME
삭제: rm
- 하드 링크 (Hard Link) : 원본 파일에 대한 직접적인 참조 (동일한 inode)
- FIFO (Named Pipes)
프로세스 간 통신(IPC)에 사용되는 파일 타입으로, 한 프로세스가 데이터를 넣으면 다른 프로세스가 데이터를 읽을 수 있는 파이프 역할을 합니다. - 소켓 (Sockets) 생성 : socket 시스템콜 / 삭제 : rm, unlink 시스템콜
네트워킹을 통한 프로세스 간 통신에 사용되는 파일 타입입니다. 소켓을 통해 프로세스는 네트워크를 통해 데이터를 전송하고 수신할 수 있습니다.- 로컬 도메인 소켓 (유닉스 도메인 소켓)
- 같은 호스트 내에서 프로세스 간 통신을 위해 사용되는 소켓 타입입니다
- 네트워크 레이어를 거치지 않기 때문에 TCP/IP 소켓에 비해 낮은 오버헤드를 가지며 더 빠른 통신이 가능합니다
- TCP 소켓
- 네트워크를 통한 프로세스 간 통신에 사용되는 소켓 타입입니다
- 데이터를 전송할 때 IP 주소와 포트 번호를 사용하여 소켓을 식별하고 통신합니다
- 네트워크를 통한 통신이 필요할 때 사용되며, 원격 호스트와의 통신에 적합합니다
- 로컬 도메인 소켓 (유닉스 도메인 소켓)
1-5. 사용 권한
- 실행 동작과 관련된 3개의 추가적인 권한 (setuid, setgid, stickey bit)
- setuid: 해당 파일 소유자의 권한을 잠시 사용. User권한에 s 표시
- setgid: 해당 파일의 그룹 권한을 잠시 사용. Group권한에 s 표시
- 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 생성
→ 스토리지 확장 및 변경에 유연하게 대처 가능
- 기본적인 논리 볼륨 생성해서 마운트
- 부착한 볼륨에 파일 시스템 생성하기 전에 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
- 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
- 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
- 부착한 볼륨에 파일 시스템 생성하기 전에 physical Volume 생성하기
- 논리 볼륨 추가로 사용하기
- 물리 볼륨 생성 및 확인
sudo pvcreate /dev/xvdg sudo pvs
- 볼륨 그룹 확장
sudo vgextend Data /dev/xvdg sudo vgs
- 논리 볼륨 확장
sudo lvextend -L +20G /dev/Data/data1 sudo resize2fs /dev/Data/data1
- 물리 볼륨 생성 및 확인
- 논리 볼륨 삭제하기
- 언마운트
vim /etc/fstab sudo umount /data1
- 논리 볼륨 삭제
sudo lvremove /dev/Data/data1
- 볼륨 그룹 삭제
sudo vgremove Data
- 물리 볼륨 삭제
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로 시작하는 모든 패키지 조회
- RPM ← RedHat 계열(RedHat, CentOS, Amazon Linux 등)
- 고수준
- 패키지를 찾아 다운로드하는 작업을 단순화 → 패키지 저장소가 존재
- 시스템 업데이트나 업그레이드 과정 자동화
- 패키지간 의존성 관리 간편화
- 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 저장소 추가)
- 저장소 키 추가
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archivekeyring.gpg
- 레포지토리 정보 추가
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
- 저장소/패키지 업데이트
sudo apt update sudo apt install redis
- 저장소 키 추가
- 운영 환경은 latest 버전이 아닌 특정 버전을 지정하여 사용 하는게 일반적임
- Latest 버전은 시점에 따라 변경이 될 수 있음
- 동일한 코드인데, 동작 시 오류가 발생할 수 있음
- 종속성 최소화 및 버그 픽스를 고려해 버전을 명시
3. 사용자 관리 (사용자 관리 이해, 새로운 사용자 추가 등)
3-1. 리눅스 계정 모델
- 전통적인 방식
- 유닉스나 리눅스에서 사용되던 전통적인 계정 모델
→ /etc/passwd, /etc/shadow, /etc/groups
- 유닉스나 리눅스에서 사용되던 전통적인 계정 모델
- 확장 방식
- LDAP 이나 Active Directory 같은 디렉토리 서비스와의 통합
→ 통합 사용자 관리 (장점: 새로운 사용자 등록, 퇴사자 관리, 역할에 따른 권한 관리 등)
- 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/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"]
3-5. AWS 클라우드 환경 SSH 접근 시 MFA 인증 구성하여 보안 강화하기
- Ubuntu 20.04 AWS EC2 사용
- google authenticator 패키지 설치
sudo apt update sudo apt install -y libpam-google-authenticator
- MFA 앱 설치
https://chromewebstore.google.com/detail/%EC%9D%B8%EC%A6%9D-%EB%8F%84%EA%B5%AC/bhghoamapcdpbohphigoooaddinpkbai - google authenticator 초기화
google-authenticator
- PAM(Pluggable Authentication Module) 정보 백업
sudo cp /etc/pam.d/sshd /etc/pam.d/sshd.bak
- 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
- sshd 설정 정보 백업
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
- 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
- ssh 서비스 재시작
sudo systemctl restart sshd.service
- ssh 연결 후 MFA 정보 확인
- google authenticator 패키지 설치
3-6. AWS 클라우드 환경에서 SSH 접속할 공개키를 잃어버린 경우, 조치 방법
- AWS SSM 사용해도 되지만, 공개키를 새로 생성해서 cloud-init으로 ssh_authorized_keys에 등록하는 방법
- cloud-init 활용 방법
- 새로운 키페어 생성 및 다운로드
- 등록할 퍼블릭 키 생성
chmod 400 new-ec2-key.pem ssh-keygen -y -f new-ec2-key.pem
- 인스턴스 중지 및 사용자 데이터 편집
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
- 인스턴스 시작
- 새로운 개인키로 서버 접근 및 cloud-init 실행 확인
ssh -i new-ec2-key.pem ubuntu@IP_ADDRESS journalctl -b 0 -u cloud-init
- 보안을 위해 인스턴스 중지 & 사용자 데이터 삭제
- 인스턴스 시작
마무리
- 유용한 명령어 위주로 정리를 해두었고 마지막에는 cloud-init 활용하는 방법을 정리해두고 싶어서 추가를 했다
반응형'데브옵스 > 운영체제' 카테고리의 다른 글
BPF 기반 리눅스 성능 분석 (2) 2024.02.05 리눅스 시스템 성능 분석 (4) 2024.02.04 리눅스 운영의 기초 : 스크립트 및 설정 자동화 (2) 2024.01.29 리눅스 운영의 기초 : 시스템 및 프로세스 관리 (0) 2024.01.21 다음글이 없습니다.이전글이 없습니다.댓글