22일차 - 리눅스 (관계형 데이터베이스, SELinux)

Jk Lim·2023년 5월 12일
0

MLOps 부트캠프

목록 보기
21/34
post-thumbnail

22일차는

  1. 관계형 데이터베이스(MariaDB)
  2. SELinux에 대해서 학습하였다.

1.관계형 데이터베이스

  • 데이터를 저장하기 위한 공간
  • Oracle Database, MySQL, MariaDB, PostgreSQL 등
  • 3306 포트 번호 사용
  • 데이터베이스와 테이블로 구성

(1) MariaDB

  • yum install mariadb-server : 설치
  • systemctl enable mariadb --now : 활성화 및 실행
  • mysql -u root -h localhost -p : maria db 로그인
  • mysql_secure_installation : 보안설정
    • 패스워드 설정 (root로 설정)
    • Remove anonymous users? [Y/n] Y
    • Disallow root login remotely? [Y/n] Y
    • Remove test database and access to it? [Y/n] Y
    • Reload privilege tables now? [Y/n] Y
  • /etc/my.cnf : MariaDB 설정 파일

(2) SQL 언어

  1. 데이터 정의 언어 (DDL)
    • 데이터베이스 or 테이블 정의 (CREATE, ALTER, DROP)
    • MariaDB [(none)]> show databases; : 데이터베이스 목록 확인
    • CREATE DATABASE test_db; : test_db라는 이름의 데이터베이스 생성
    • use test_db; : 데이터베이스 선택 (MariaDB [test_db]> 로 바뀜)
    • 테이블 생성
      MariaDB [test_db]> CREATE TABLE user (
          -> num int AUTO_INCREMENT,
          -> name varchar(50) NOT NULL,
          -> email varchar(50),
          -> PRIMARY KEY(num)
          -> );
    • MariaDB [test_db]> SHOW TABLES; : 테이블 목록 확인
    • DESCRIBE user; : 테이블에 대한 정보 출력
    • CREATE USER user01@localhost IDENTIFIED BY 'user01'; : 사용자 생성 (user01/user01)
    • mysql 데이터베이스의 User 테이블에 사용자 정보가 기록됨
    • ALTER TABLE user ADD phone varchar(20); : phone 컬럼을 추가
    • ALTER TABLE user DROP COLUMN phone; : 테이블 필드 제거
    • ALTER TABLE user CHANGE num id int AUTO_INCREMENT; : 필드 명 변경 (옵션이 바뀌지 않아도 다시 기입해줘야하 함)
    • DROP DATABASE [데이터베이스]; : 데이터베이스 제거
    • DROP TABLE [테이블]; : 테이블 제거 (테이블은 해당 데이터베이스 use 상태에서 작업해야함)
  2. 데이터 조작 언어 (DML)
    • INSERT, SELECT, UPDATE, DELETE
    • INSERT INTO user (name, email) VALUES ('jklim', 'jklim@gmail.com'); : 데이터 입력
    • SELECT * FROM user; : 테이블에 있는 모든 필드 출력
    • SELECT name, email FROM user; : 특정 필드만 선택 출력
    • SELECT name,email FROM user WHERE id=3; : 조건에 맞는 레코드, 필드 출력
    • UPDATE user SET email='gs@nobreak.co.kr' WHERE id=1; : 레코드 값 수정
    • DELETE FROM user WHERE id =1; : 조건에 해당하는 레코드 삭제
  3. 데이터 제어 언어 (DCL)
    • 사용자의 데이터 접근 권한 제어 (GRANT, REVOKE)
    • GRANT SELECT,INSERT ON user TO user01@localhost; : user01에게 SELECT, INSERT권한 부여
    • FLUSH PRIVILEGES; : 권한 변경 후, 권한 테이블을 적용
    • SHOW GRANTS FOR user01@localhost; ; user01의 권한 조회
    • REVOKE INSERT ON user FROM user01@localhost; user01의 권한 회수

(3) 백업

  1. 물리적 백업
    • /etc/my.cnf → datadir=/var/lib/mysql 에 데이터베이스 파일이 저장되어있음
    • /var/lib/mysql 해당 디렉토리에 저장된 파일들을 묶어서 저장 → 쉽고 빠름
    • 복원이 제대로 안될 수 있다. 하드웨어, 버전 등의 여러 환경적인 부분 때문
  2. 논리적 백업
    • 데이터베이스를 파일화 (구조, 데이터 내용 등)
    • 데이터베이스 설정 적용 불가
    • 복원하는데 시간이 걸림
    • 논리적 백업 / 복원 실습
      • mysqldump -u root -p test_db > /root/test_db.dump : 백업
      • file test_db.dump : 백업 파일 형식 확인 (단순 텍스트 파일)
    ### 논리적 복원
    MariaDB [(none)]> CREATE DATABASE test_db_restore;  ### 복원할 공간 생성
    [root@localhost ~]# mysql -u root -p test_db_restore < test_db.dump

2. SELinux

  • Secure Linux의 약자
  • 하나의 서비스가 관련되지 않은 다른 데이터에 접근하지 못하도록 함 (웹 서비스를 제공 받고자하는 사용자는 웹만 사용하여야 함. 데이터베이스로 접근하면 안됨)
  • 리눅스의 접근 통제 방식 : DAC, MAC 두가지를 혼합해서 사용
    • DAC : 권한과 관련. 접근하는 사람이 누구인지를 보고 통제. 일반적인 시스템.
    • MAC : 프로세스, 포트 등을 제어해서 통제
  • SELinux는 MAC 모델의 대표적인 예
  • 모든 파일, 프로세스, 포트, 디렉토리에는 특수 레이블 존재.
    • ps axZ 명령어 → LABEL → system_u:system_r:init_t:s0 (사용자: 역할: 유형: 민감도)
    • 이중에서 다룰 내용은 유형 (init_t)
    • ps axZ | grep http : apache 서비스의 유형 확인 (ps -ZC httpd 로도 확인 가능) → httpd_t
    • ls -Z /var/www/ : 디렉토리에도 특수 레이블이 존재 →httpd_sys_content_t
    • 관련되는 레이블끼리 연결을 시켜주는 개념 (httpd_t ↔ httpd_sys_content_t)
  • getenforce 명령어 : SELinux의 활성화 여부 확인
  • setenforce 0 또는 1 : SELinux 비활성화 또는 활성화
  • /etc/selinux/config : SELinux의 설정 파일 (SELINUX=enforcing : 부팅 시 자동 활성화)
### 유형 컨텍스트 변환 확인. -a 옵션으로 복사 하면 유형이 바뀜
[root@localhost ~]# cp file.html /var/www/html/file_1.html
[root@localhost ~]# cp -a file.html /var/www/html/file_2.html
[root@localhost ~]# ls -Z /var/www/html/
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 file_1.html
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 file_2.html
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 test.html

### https://192.168.56.100/file_1.html -> 접근 가능
### https://192.168.56.100/file_2.html -> 접근 불가 httpd 유형 컨텍스트가 안맞음
  • semanage : SELinux의 유형 컨텍스트를 제어하는 명령어
  • semanage fcontext -l | grep /var/www : httpd 에 대한 유형 컨텍스트 생성 규칙
### 유형 컨텍스트 생성 실습
[root@localhost ~]# mkdir -p /content/httpd/
[root@localhost ~]# ls -dZ /content/httpd/
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /content/httpd/
### 규칙이 없어서 default_t로 생성됨

### semanage에 해당 디렉토리에 대한 내용이 추가되어야 함
[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t '/content/httpd(/.*)?'
[root@localhost ~]# restorecon -RFv /content/httpd/     ### 적용
[root@localhost ~]# ls -dZ /content/httpd
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /content/httpd

### 기존 파일(file_2.html) 컨텍스트 변경
[root@localhost ~]# ls -Z /var/www/html/file_2.html
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 file_2.html
[root@localhost ~]# restorecon -Rv /var/www/html
restorecon reset /var/www/html/file_2.html context unconfined_u:object_r:admin_home_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
[root@localhost ~]# ls -Z /var/www/html/file_2.html
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 file_2.html

### 반영구 임시 변경 방법
[root@localhost ~]# chcon -t mysqld_db_t /var/www/html/file_2.html
[root@localhost ~]# ls -Z /var/www/html/file_2.html
-rw-r--r--. root root unconfined_u:object_r:mysqld_db_t:s0 file_2.html
  • SELinux 부울 : 정책 허용 스위치
    - getsetbool -a : 전체를 확인하는 방법
    - getsebool httpd_enable_homedirs
    - semanage boolean -l : 현재, 영구 정책 확인
    [root@localhost ~]# semanage boolean -l | grep httpd_enable_homedirs
    httpd_enable_homedirs          (비활성  , 비활성 )  Allow httpd to enable homedirs
    ### 현재 설정 on
    [root@localhost ~]# setsebool httpd_enable_homedirs on
    [root@localhost ~]# semanage boolean -l | grep httpd_enable_homedirs
    httpd_enable_homedirs          (활성   , 비활성 )  Allow httpd to enable homedirs
    ### 영구 설정 on (-P옵션 사용)
    [root@localhost ~]# setsebool -P httpd_enable_homedirs on
    [root@localhost ~]# semanage boolean -l | grep httpd_enable_homedirs
    httpd_enable_homedirs          (활성   ,  활성 )  Allow httpd to enable homedirs
  • SELinux 포트 제어
    • vim /etc/httpd/conf/httpd.conf → Listen 80 을 주석처리하고 Listen 82 추가
    • systemctl restart httpd → 에러남 → journalctl -xe : 1차 로그로 세부 내용 확인
    • semanage port -l | grep http : SElinux 바인딩 포트 확인 → 82번이 없음
    • semanage port -a -t http_port_t -p tcp 82 : 포트 추가
    • firewall-cmd --add-port=82/tcp

추가) fstab 잘못 수정 후 부팅 안될 시, 대처방법

  • 상황 : /mnt/data의 파일시스템 부분이 xf로 오타
  • root 비밀번호를 잊어버리면 rescue mode
  • fastab 설정이 잘못되면 emergency mode
  • emergency mode로 진입 방법
    1. 부트로더 선택 항목에서 e 누르기
    2. Linux 끝에 띄어쓰기 후 systemd.unit=emergency.target 입력 ctrl+x
  • mount -o remount,rw / : 루트 디렉토리를 재마운트 (읽기 쓰기 모드로)
  • mount -a 를 입력하면 잘못된 부분을 찾아줌 → 수정하고 다시 마운트
  • ctrl + d 로 재부팅
  • man bootup : 부팅하는 과정 (유닛 실행 절차) 를 확인 할 수 있는 명령어

0개의 댓글