본문 바로가기

정보 보안 수업/Lab 구성

정보 보안 랩(Lab) 파트 III: MariaDB 설치

가. 관계형 데이터베이스 관리 시스템(RDBMS) 설치하기


1. MariaDB 설치하기

[root@localhost ~]# yum -y install mariadb-server

 

2. MariaDB의 언어셋을 UTF8로 설정

    -  UTF-8은 한글 1글자 3byte의 크기

    -  DB의 언어셋를 UTF8로 설정하지 않으면 한글 깨짐


[참고] DB 관련 리눅스 추가 내용 
/etc/my.cnf: MariaDB의 설정파일
/usr/libexec/mysqld: MariaDB 서비스 데몬 (패키지 mariadb-server)
/usr/bin/mysql: MariaDB 클라이언트 (패키지 mariadb) 
/var/lib/mysql: 리눅스용 MariaDB 서버의 위치(기본값)

 

symbolic-links=0 밑에 4개의 설정을 추가

[root@localhost ~]# vi /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
collation-server=utf8_general_ci
character-set-server=utf8
skip-character-set-client-handshake
#bind-address=127.0.0.1

 

이미지. 1 /etc/my.cnf 설정 화면

 

3. MariaDB 활성화 및 시작하기

MariaDB를 먼저 활성화 시키고 DB를 시작 그리고 상태 값 확인

 

1) Maria DB 활성화 : 서버가 재부팅 후에도 DB가 자동 실행

[root@localhost ~]# systemctl enable mariadb
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.


2) Maria DB 시작
[root@localhost ~]# systemctl start mariadb

3) Maria DB 상태 확인 : enabled 와 active 키워드 확인

[root@localhost ~]# systemctl status mariadb
 mariadb.service - MariaDB database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; ven                                                                                                                      dor preset: disabled)
   Active: active (running) since 목 2023-10-26 23:14:13 KST; 24s ago
  Process: 8554 ExecStartPost=/usr/libexec/mariadb-wait-ready $MAINPID (                                                                                                                     code=exited, status=0/SUCCESS)
  Process: 8471 ExecStartPre=/usr/libexec/mariadb-prepare-db-dir %n (cod                                                                                                                     e=exited, status=0/SUCCESS)
 Main PID: 8553 (mysqld_safe)
   CGroup: /system.slice/mariadb.service
           ├─8553 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
           └─8754 /usr/libexec/mysqld --basedir=/usr --datadir=/var/l...

10월 26 23:14:11 localhost.localdomain mariadb-prepare-db-dir[8471]: ...
10월 26 23:14:11 localhost.localdomain mysqld_safe[8553]: 231026 23:...
10월 26 23:14:11 localhost.localdomain mysqld_safe[8553]: 231026 23:...
10월 26 23:14:13 localhost.localdomain systemd[1]: Started MariaDB d...
Hint: Some lines were ellipsized, use -l to show in full.

 

4) TCP 실시간 세션 및 서비스 확인 : Maria DB 서비스 포트는 3306/TCP

[root@localhost ~]# ss -nlt
State      Recv-Q    Send-Q                  Local Address:Port                     Peer Address:Port
LISTEN     0             50                                    *:3306                                          *:*
LISTEN     0           128                                         *:22                                          *:*
LISTEN     0           100                            127.0.0.1:25                                          *:*
LISTEN     0           100                                   [::]:8009                                          [::]:*
LISTEN     0           100                                   [::]:8080                                          [::]:*
LISTEN     0           128                                       [::]:80                                          [::]:*


4. MariaDB 접속

mysql 로 MariaDB 접속 시, root 계정 로그인 요청 없음

[root@localhost ~]# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.68-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

1) DB 상태 확인 및 utf8 설정 확인
MariaDB [(none)]> status

 

이미지. 2 status 값 확인 화면

 

2) DB 에서 나오기 
MariaDB [(none)]> quit
Bye

 

5. 관리자 비번 설정

mariadb를 설치하면 DB 관리자(root)의 비밀번호가 없다. 그렇기 때문에

사용하기 위해서는 반드시 관리자의 비밀번호를 설정을 해야한다.

- mysqladmin: 여러 가지 역할을 하는 관리자용 프로그램

형식 : mysqladmin [OPTIONS] command command....

mysqladmin -h 호스트명 -u 사용자 -p비밀번호 password [new-password]

 

● h localhost :  DBMS 서버가 localhost 있으면 생략 가능

● u root : 현재 mysqladmin 명령어를 사용하는 사용자가 root이면 생략가능

 

[root@localhost ~]# mysqladmin -p password
Enter password:                 ← 비번이 없기 때문에 엔터
New password:                  ← 패스워드 입력
Confirm new password:     ← 패스워드 재 입력 
[root@localhost ~]#


비밀번호를 설정한 후 mysql로 접속하면 접속이 안되면 정상적으로 비밀번호가 설정 됨

[root@localhost ~]# mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
[root@localhost ~]#

 

1) 접속 방법:

root@localhost ~]# mysql --help
Usage: mysql [OPTIONS] [database]
Default options are read from the following files in the given order:
/etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf 
  
  -h, --host=name     Connect to host.
  -u, --user=name     User for login if not current user.
  -p, --password[=name] 


 1.1. mysql -h 호스트명 -u 사용자 -p비밀번호 
 1.2. mysql -h 호스트명 -u 사용자 -p
 1.3. mysql -u 사용자 -p
 1.4. mysql -p

예시: 패스워드가 P@sswOrd 일 경우

root@localhost ~]# mysql -h localhost -u root -pP@ssw0rd
MariaDB [(none)]> exit
[root@localhost ~]# mysql -u root -pP@ssw0rd  ← DB서버가 로컬에 있으므로 -h localhost 는 생략 가능
MariaDB [(none)]> exit
[root@localhost ~]# mysql -pP@ssw0rd             ←  현재 사용자 root이므로 -u root 는 생략 가능
MariaDB [(none)]> exit
[root@localhost ~]# mysql -p    ← -pP@ssw0rd 가 취약하므로 비밀번호를 안보이게 입력 받아서 접속
Enter password:                        ←  P@ssw0rd 
MariaDB [(none)]> exit
[root@localhost ~]# mysql        ← -p 옵션이 없기 때문에 에러 발생
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

 

6. DB서버 자동 접속 설정하기
자신의 홈디렉터리($HOME)에 .my.cnf 파일을 아래처럼 만들어 놓으면 호스트명, 사용자, 비밀번호
입력을 생략하고 DBMS(mariadb) 서버에 자동으로 접속


[root@localhost ~]# vi .my.cnf
[client]
host = localhost     #  ← -h localhost
user = root          #  ← -u root
password = P@ssw0rd  # ← -pP@ssw0rd

 

이미지. 3 Home 디렉토리에서 .my.cnf 설정 파일 확인


1) 설정파일이 저장되면 권한(Permission) 변경

1.1. 변경 전

[root@localhost ~]# ls -al .my.cnf
-rw-r--r--. 1 root root 60 10월 26 23:42 .my.cnf

 

1.2. 파일 권환: 600 변경
[root@localhost ~]# chmod 600 .my.cnf

 

1.3. 변경 후

[root@localhost ~]# ls -al .my.cnf
-rw-------. 1 root root 60 10월 26 23:42 .my.cnf

 

2) 자동 접속 되는지 확인

[root@localhost ~]# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 7
Server version: 5.5.68-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

 

7. 불필요한 mysql.db 사용자 및 DB 설정(% 계정) 삭제

  ● 비밀번호가 없는 사용자 삭제

  ● % 계정 삭제


1) DB 목록 확인 (DB 폴더: 파일을 저장)

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

 

2) TB 목록 확인 (TB 파일: 데이터 저장)

MariaDB [(none)]>  SHOW TABLES;     

 

3) mysql DB의 테이블 확인
    - db 테이블: 사용자 DB에 권한이 저장된 테이블
    - user 테이블: 사용자 접속 정보가 저장된 테이블

MariaDB [mysql]> SHOW TABLES;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |                ←  사용자 계정이 연결된 데이터베이스 
| event                     |
| func                      |
... 중간 생략 ...
| time_zone_transition      |
| time_zone_transition_type |
| user                      |                ← 사용자 접속 정보가 저장된 테이블
+---------------------------+
24 rows in set (0.00 sec)

 

3.1. mysql DB로 접속

MariaDB [(none)]> use mysql

 

3.2. 패스워드 없는 사용자 계정 삭제
3.2.1. user 테이블에서 host,user,password 컬럼 출력 확인

MariaDB [mysql]> SELECT host, user, password FROM user;
+-----------------------+------+-------------------------------------------+
| host                  | user | password                                  |
+-----------------------+------+-------------------------------------------+
| localhost             | root | *C2E5C800B52D79E092646480D96CE6DC29EE78DC |
| localhost.localdomain | root |                                           |
| 127.0.0.1             | root |                                           |
| ::1                   | root |                                           |
| localhost             |      |                                           |
| localhost.localdomain |      |                                           |
+-----------------------+------+-------------------------------------------+
6 rows in set (0.00 sec)

 

3.2.2. user 테이블에서 password의 값이 없는 사용자 5명 모두 삭제

MariaDB [mysql]> DELETE FROM user WHERE password='';
Query OK, 5 rows affected (0.00 sec)

 

3.2.3. 패스워드 없는 사용자 삭제 확인
MariaDB [mysql]> SELECT host, user, password FROM user;
+-----------+------+-------------------------------------------+
| host      | user | password                                  |
+-----------+------+-------------------------------------------+
| localhost | root | *C2E5C800B52D79E092646480D96CE6DC29EE78DC |
+-----------+------+-------------------------------------------+
1 row in set (0.00 sec)

3.3. 모든 호스트에서 모든 데이터베이스에 액세스할 수 있는 사용자 계정 삭제

MariaDB [mysql]> SELECT host, user, db from db;
+------+------+---------+
| host | user | db      |
+------+------+---------+
| %    |      | test    |
| %    |      | test\_% |
+------+------+---------+
2 rows in set (0.00 sec)

 

[참고] MariaDB에서 기본적으로 생성되는 두 개의 사용자 계정

         
 ※   % : 모든 호스트에서 모든 데이터베이스에 액세스할 수 있는 사용자 계정

 ※   % : 모든 호스트에서 test 데이터베이스에만 액세스할 수 있는 사용자 계정

 

3.3.1. db 테이블에 저장된 모든 데이터 삭제
MariaDB [mysql]> DELETE FROM db;
Query OK, 1 row affected (0.00 sec)

3.3.2. db 테이블에 확인

MariaDB [mysql]> SELECT host,user,db FROM db;
Empty set (0.00 sec)

3.3.3. 권한을 다시 읽어들이기

MariaDB [mysql]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

 

나. DB 및 테이블 만들기

DB: 테이블을 저장하는 공간(디렉터리)
● DB 확인: SHOW DATABASES
● DB 생성: CREATE DATABASE
● DB 삭제: DROP DATABASE

 

1. DB 생성하기:

형식 : CREATE DATABASE DB명

MariaDB [(none)]> CREATE DATABASE tempdb;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| tempdb             |
| test               |
+--------------------+
5 rows in set (0.00 sec)

 

 

2. DB 삭제 하기

MariaDB [(none)]> DROP DATABASE tempdb;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

 

 

3. 테이블 생성하기:
형식: CREATE TABLE TB명 ( 컬럼명 자료형, .... )

3.1. 생성한 tempdb DB 사용(접속)

MariaDB [(none)]> USE tempdb;

3.2. 테이블 만들기:
● 테이블 이름: member
● 컬럼명: no, 데이터 타입 : int, 옵션 : 번호 자동증가, 제약조건 : primary key
● 컬럼명: name, 데이터 타입 : varchar(10), 제약조건: not null
● 컬럼명: phone, 데이터 타입 : varchar(15)


MariaDB [tempdb]> CREATE TABLE member(
    -> no int not null auto_increment primary key,
    -> name varchar(10) not null,
    -> phone varchar(15),
    -> email varchar(50) not null
    -> );
Query OK, 0 rows affected (0.01 sec)

 

3.3. 테이블 확인

MariaDB [tempdb]> SHOW TABLES;
+------------------+
| Tables_in_tempdb |
+------------------+
| member           |
+------------------+
1 row in set (0.00 sec)

3.4. 멤버 테이블 구조 확인
MariaDB [tempdb]> DESC member;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| no    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(10) | NO   |     | NULL    |                |
| phone | varchar(15) | YES  |     | NULL    |                |
| email | varchar(50) | NO   |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

3.5. 자료 추가하기: INSERT
형식: INSERT INTO TB명 VALUES(값, ...);

INSERT INTO member VALUES(NULL, '홍길동', '010-1111-2222', 'mrhong@naver.com'); 
INSERT INTO member VALUES(NULL, '홍길순', '010-2222-3333', 'koreasoon@daum.net');

3.6. 자료 검색하기: SELECT
형식: SELECT 컬럼명 FROM TB명;

MariaDB [koreadb]> SELECT * FROM member;
MariaDB [koreadb]> SELECT no, name FROM member;
MariaDB [koreadb]> SELECT no, phone, name FROM member;

3.7. 자료 삭제하기: DELETE 
형식1: DELETE FROM TB명;  -- 자료 전체가 모두 삭제
형식2: DELETE FROM TB명 WHERE 컬럼명 = '값';  -- 컬럼명에 해당하는 자료가 삭제

member 테이블에서 no의 값이 1인 레코드(행)를 삭제
MariaDB [koreadb]> DELETE FROM member WHERE no=1;

3.8. 자료 수정하기: UPDATE
형식1: UPDATE TB명 SET 컬럼명='값';  -- 자료 전체가 모두 수정
형식2: UPDATE TB명 SET 컬럼명='값' WHERE 조건;  -- 조건에 해당하는 자료가 수정

3.8.1. member 테이블에서 홍긴순의 no 의 값을 1로 변경  
MariaDB [koreadb]> UPDATE member SET no=1 WHERE name='홍길순';


주의! 조건식(WHERE)을 이름을 할 경우 중복된 이름이 있을 경우 관련 된 이름들에 적용 

그래서 보통 조건식에서 ID를 사용


3.8.2. member 테이블에서 no 의 값이 1인 회원의 전화번호를 010-1234-1234로 변경
MariaDB [koreadb]> UPDATE member SET phone='010-1234-1234' WHERE no = 1;