인프라 아키텍쳐

테스트를 위한 인프라 구성입니다.

 

실무에서는 더 복잡한 구성이고 노란 박스안의 개인정보 처리자 영역이 대부분 서비스 서버와 다른 네트워크에 존재 하겠지만 여기서는 IP 대역으로 아래와 같이 구분해서 별도의 네트워크라고 간주하겠습니다.

 

~192.168.45.99 : IDC 

       192.168.45.20~192.168.45.29 : Public Network (Web, API, App)

       192.168.45.30~192.168.45.39 : Private Network (DB)

 

192.168.45.100~ : 업무공간

 

계정별로 접근 가능한 IP 대역을 부여해 보기 위해 위처럼 가상으로 구분하겠습니다.

 

 

 

 

사용자 계정 생성

사용자 계정을 생성하기 전에 앞서 정리했던 보안 시나리오를 다시 한번 상기해 보겠습니다.

https://opensrc.tistory.com/257

 

[MariaDB] 보안 취약점 점검 #3 보안 시나리오

이전 페이지에서 필요한 플러그인 설치는 완료 했습니다.https://opensrc.tistory.com/256 [MariaDB] 보안취약점 점검 #2 비밀번호 알고리즘 개선 - 플러그인 설치MariaDB에서 제공하는 주요 비밀번호 보안 관

opensrc.tistory.com

 

비밀번호

  • 최소 숫자 2자리 포함
  • 최소 대/소문자 2자리 포함
  • 최소 특수문자 2자리 포함
  • 비밀번호 최소 길이 10자리 이상
  • 유추하기 쉬운 비밀번호 사용 금지
  • 사용한 비밀번호 직전 3회 사용 금지
  • 비밀번호 유효기간 90일
  • 안전한 비밀번호 알고리즘 사용 (md5, sha1 같은 취약한 알고리즘 불가)

 

계정 및 접근 관리

  • 개인별 계정 및 IP 할당
  • 개인 계정 별 권한 차등 부여

미리 생성한 webservice db 에 대해 dba(192.168.45.102)는 모든 권한을, 실제 어플리케이션에서 접속 해서 서비스를 하는 webservice(192.168.45.21, 192.168.45.22) 에게는 읽기 쓰기, 수정, 삭제, 실행, developer1(195.168.45.102, 매니저) 계정에 읽기, 쓰기, 수정, 삭제, 실행, developer2(195.168.45.103, 쥬니어) 에게는 읽기, 실행 권한만 부여해보도록 하겠습니다.

 

계정 생성 하기전에 이전에 설치한 비밀번호 보안 플러그인이 잘 동작하는지도 확인해 보겠습니다.

password_reuse_check plugin

MariaDB [mysql]> create user 'developer'@'192.168.45.103' identified via ed25519 using  password ('보안삭제') password expire interval 90 day;
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements (password_reuse_check)
MariaDB [mysql]>

실제 사용할 계정을 만들었다가 drop 하고 같은 비밀번호로 생성시도 했을때 비밀번호 재사용 정책 위반으로 에러가 발생했습니다

 

simple_password_check

MariaDB [mysql]> create user 'developer'@'192.168.45.103' identified via ed25519 using  password ('Bass') password expire interval 90 day;
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements (simple_password_check)
MariaDB [mysql]>

간단한 문자열 역시 에러가 발생합니다.

 

cracklib_password_check

MariaDB [mysql]> create user 'developer'@'192.168.45.103' identified via ed25519 using  password ('Developer!@QWER1234') password expire interval 90 day;
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements (cracklib_password_check)
MariaDB [mysql]>

예측 가능한 단어로 이뤄진 비밀번호는 복잡해도 사용할 수 없습니다.

 

모두 정상 작동 하고 있습니다.

 

 

사용자 생성

MariaDB [mysql]> select host, user, plugin from user;
+-----------+-------------+-----------------------+
| Host      | User        | plugin                |
+-----------+-------------+-----------------------+
| localhost | mariadb.sys | mysql_native_password |
| localhost | root        | ed25519               |
| localhost | mysql       | mysql_native_password |
+-----------+-------------+-----------------------+
3 rows in set (0.004 sec)

MariaDB [mysql]> create user 'dba'@'192.168.45.102' identified via ed25519 using password('보안삭제') password expire interval 90 day;
Query OK, 0 rows affected (0.023 sec)

MariaDB [mysql]> create user 'developer1'@'192.168.45.102' identified via ed25519 using password('보안삭제') password expire interval 90 day;
Query OK, 0 rows affected (0.021 sec)

MariaDB [mysql]> create user 'developer2'@'192.168.45.103' identified via ed25519 using password('보안삭제') password expire interval 90 day;
Query OK, 0 rows affected (0.021 sec)

MariaDB [mysql]> create user 'webservice'@'192.168.45.20/255.255.255.252' identified via ed25519 using password('보안삭제') password expire interval 90 day;
Query OK, 0 rows affected (0.045 sec)

MariaDB [mysql]> select user, host, plugin from user;
+-------------+-------------------------------+-----------------------+
| User        | Host                          | plugin                |
+-------------+-------------------------------+-----------------------+
| mariadb.sys | localhost                     | mysql_native_password |
| root        | localhost                     | ed25519               |
| mysql       | localhost                     | mysql_native_password |
| dba         | 192.168.45.102                | ed25519               |
| developer1  | 192.168.45.102                | ed25519               |
| webservice  | 192.168.45.20/255.255.255.252 | ed25519               |
| developer2  | 192.168.45.103                | ed25519               |
+-------------+-------------------------------+-----------------------+
7 rows in set (0.005 sec)

MariaDB [mysql]>

 

MySQL 계열 DB에서는 사용자ID가 같아도 Host가 다르면 다른 계정으로 인식한다는 점을 숙지해야 합니다.

Host는 단독 IP로 지정을 할 수 도 있지만, 와일드카드 %를 이용하여 범위를 지정 할 수 있습니다.

developer@% 이면 IP 제한 없이 어디에서든 접속 가능합니다.

developer@10.10.% 이면 10.10.xxx.xxx 네트워크 B클래스 어디서든 접속 가능합니다.

네트워크 마스크 비트를 이용한 developer@192.168.45.0/24 이런식으로 지정은 불가하고 

developer@192.168.45.0/255.255.255.0 이런식으로 서브넷 마스크를 이용 할 수 있습니다.

192.168.45.20/255.255.255.252 는 192.168.45.20 ~ 23까지 4개의 IP를 허용 합니다.

 

권한 부여

dba 계정에 데이터베이스 webservice 의 모든 권한을 부여해보겠습니다.

MariaDB [mysql]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| webservice         |
+--------------------+
5 rows in set (0.002 sec)

MariaDB [mysql]> grant all privileges on webservice.* to 'dba'@'192.168.45.102';
Query OK, 0 rows affected (0.004 sec)

MariaDB [mysql]> show grants for 'dba'@'192.168.45.102';
+--------------------------------------------------------------------------------------+
| Grants for dba@192.168.45.102                                                        |
+--------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `dba`@`192.168.45.102` IDENTIFIED VIA ed25519 USING '보안삭제' |
| GRANT ALL PRIVILEGES ON `webservice`.* TO `dba`@`192.168.45.102`                     |
+--------------------------------------------------------------------------------------+
2 rows in set (0.001 sec)

MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.003 sec)

MariaDB [mysql]>

 

webservice 계정에 조회, 입력, 수정, 삭제, 실행, 보기 권한을 부여해보겠습니다.

MariaDB [mysql]> grant select, insert, update, delete, execute, show view on webservice.* to 'webservice'@'192.168.45.20/255.255.255.252';
Query OK, 0 rows affected (0.003 sec)

MariaDB [mysql]> show grants for 'webservice'@'192.168.45.20/255.255.255.252';
+----------------------------------------------------------------------------------------------------------------------------+
| Grants for webservice@192.168.45.20/255.255.255.252                                                                        |
+----------------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `webservice`@`192.168.45.20/255.255.255.252` IDENTIFIED VIA ed25519 USING '보안삭제'                 |
| GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE, SHOW VIEW ON `webservice`.* TO `webservice`@`192.168.45.20/255.255.255.252` |
+----------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.001 sec)

MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.003 sec)

MariaDB [mysql]>

 

devleper1 계정에  조회, 입력, 수정, 삭제, 실행, 보기 developer2 계정에 조회, 실행, 보기 권한을 부여하겠습니다.

MariaDB [mysql]> grant select, insert, update, delete, execute, show view on webservice.* to 'developer1'@'192.168.45.102';
Query OK, 0 rows affected (0.003 sec)

MariaDB [mysql]> grant select, execute, show view on webservice.* to 'developer2'@'192.168.45.103';
Query OK, 0 rows affected (0.003 sec)

MariaDB [mysql]> show grants for 'developer1'@'192.168.45.102';
+-------------------------------------------------------------------------------------------------------------+
| Grants for developer1@192.168.45.102                                                                        |
+-------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `developer1`@`192.168.45.102` IDENTIFIED VIA ed25519 USING '보안삭제'                 |
| GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE, SHOW VIEW ON `webservice`.* TO `developer1`@`192.168.45.102` |
+-------------------------------------------------------------------------------------------------------------+
2 rows in set (0.001 sec)

MariaDB [mysql]> show grants for 'developer2'@'192.168.45.103';
+---------------------------------------------------------------------------------------------+
| Grants for developer2@192.168.45.103                                                        |
+---------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `developer2`@`192.168.45.103` IDENTIFIED VIA ed25519 USING '보안삭제' |
| GRANT SELECT, EXECUTE, SHOW VIEW ON `webservice`.* TO `developer2`@`192.168.45.103`         |
+---------------------------------------------------------------------------------------------+
2 rows in set (0.001 sec)

MariaDB [mysql]>

MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.003 sec)

MariaDB [mysql]>

 

사용자에게 권한이 없는 명령을 실행하면 아래와 같이 command denied to user ... 에러가 발생 합니다.

 

참고1 : 권한을 부여 할 때 개별 테이블, 컬럼까지도 상세하게 줄 수 있습니다.

참고2 : 테이블 별로 권한이 복잡해 지는 경우 사용자 관리에 공수가 많이 들 것 같아서 MariaDB에서 role을 생성하고 그 role에 권한을 부여하는 방법을 테스트 해보았지만 원하는 대로 동작하지 않았습니다. https://opensrc.tistory.com/236

잘 아시는 분은 조언 부탁드립니다.

참고3 : 외부에서 DB클라이언트를 통해 접속시 Socket Error (115) 에 나오는 분은 bind_address를 확인해 보세요

더보기

외부에서 DBeaver 접속 했을 때 아래와 같은 오류가 발생 했습니다.

Socket fail to connect to 192.168.45.31. Connection refused: getsockopt
  Connection refused: getsockopt

 

다른 ubunut 에서 접속 하면 아래와 같은 에러가 발생 했습니다.

 

$ mysql -h192.168.45.31 -udeveloper1 -p
Enter password:
ERROR 2002 (HY000): Can't connect to server on '192.168.45.31' (115)
$

 

외부에서 연결이 안되는 경우는 대부분 방화벽 문제가 많습니다.

$ sudo ufw status
Status: inactive
$ netstat -nltp
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.54:53           0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:6011          0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp6       0      0 ::1:6010                :::*                    LISTEN      -
tcp6       0      0 ::1:6011                :::*                    LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -
$

방화벽은 비활성화 되어 있고 MariaDB가 127.0.0.1:3306 루프백 IP로 바인딩 되어 있네요 이게 문제 인것 같습니다.

 

오류 메시지로 구글링 하면 대부분 해결책을 찾을 수 있습니다.

https://stackoverflow.com/questions/64320136/error-2002-hy000-cant-connect-to-mysql-server-on-192-168-1-15-115

 

두가지를 확인하라고 하네요

SHOW VARIABLES LIKE 'skip_networking'; (result should be off)
SHOW VARIABLES LIKE 'bind_address'; (should not be 127.0.0.1)

 

MariaDB [(none)]> show variables like 'skip_networking';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| skip_networking | OFF   |
+-----------------+-------+
1 row in set (0.005 sec)

MariaDB [(none)]> show variables like 'bind_address';
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| bind_address  | 127.0.0.1 |
+---------------+-----------+
1 row in set (0.005 sec)

MariaDB [(none)]>

 

역시 bind_address 가 문제 였습니다.

my.cnf 에 추가하고 재가동 하면 되는데,

제가 설치한 ubuntu 에는 /etc/mysql/mariadb.conf.d/50-server.cnf 파일에 IP를 변경해 주면 됩니다.

$ sudo vi /etc/mysql/mariadb.conf.d/50-server.cnf
... 생략...
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address            = 127.0.0.1
bind-address            = 192.168.45.31
... 생략
$

 

다음 편에서는 감사로그 다루는 방법을 알아 보겠습니다.

 

끝.

root 계정 보안

일반 사용자 계정 생성에 앞서 root 계정에 대한 보안을 체크해 보겠습니다.

MariaDB 10.4 이상에서 DB를 설치 하면 OS의 super user 권한을 가질 때 비밀번호 없이 MariaDB에 접속할 수 있습니다.

$ sudo mysql -uroot
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 37
Server version: 11.4.3-MariaDB-1 Ubuntu 24.10

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

Support MariaDB developers by giving a star at https://github.com/MariaDB/server
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

 

MariaDB 10.4 부터는 unix_socket 방식으로 인증 하도록 되어있기 때문에 localhost 상에서 root 접속시 OS의 root 권한이 있는 경우 DB인증이 자동으로 되는 개념인 것 같습니다.

MariaDB [(none)]> show create user root@localhost;
+----------------------------------------------------------------------------------------------------+
| CREATE USER for root@localhost                                                                     |
+----------------------------------------------------------------------------------------------------+
| CREATE USER `root`@`localhost` IDENTIFIED VIA mysql_native_password USING 'invalid' OR unix_socket |
+----------------------------------------------------------------------------------------------------+
1 row in set (0.001 sec)

MariaDB [(none)]>

 

OS의 root 권한으로 접속 하더라도 비밀번호를 입력해야 접속하도록 변경하는게 좋습니다.

주의 : unix_socket 으로 연동 되는 경우 반드시 OS의 super user 권한을 획득해야 합니다.

unix_socket 를 해제하고 비밀번호 방식으로 변경하게 되면 일반 사용자이더라도 마리아DB의 root@localhost 계정의 비밀번호를 알고 있고 콘솔에 접근이 된 상태면 root 권한으로 DB 접속을 할 수 있습니다.

어느 것이 보안에 더 좋을지는 판단을 하는 것이 좋겠습니다.

 

root  계정의 인증 방식을 확인합니다.

MariaDB [(mysql)]> show create user root@localhost;
+----------------------------------------------------------------------------------------------------+
| CREATE USER for root@localhost                                                                     |
+----------------------------------------------------------------------------------------------------+
| CREATE USER `root`@`localhost` IDENTIFIED VIA mysql_native_password USING 'invalid' OR unix_socket |
+----------------------------------------------------------------------------------------------------+
1 row in set (0.001 sec)

MariaDB [mysql]> select host, user, password, plugin from user where user = 'root';
+-----------+-------------+----------+-----------------------+
| Host      | User        | Password | plugin                |
+-----------+-------------+----------+-----------------------+
| localhost | root        | invalid  | mysql_native_password |
+-----------+-------------+----------+-----------------------+
1 rows in set (0.005 sec)

unix_socket 방식은 인증을 OS에 위임하는 것 같습니다.

 

 

ed25519 비밀번호 방식으로 변경해 보겠습니다.

MariaDB [mysql]> alter user 'root'@'localhost' identified via ed25519 using password('비밀번호삭제');
Query OK, 0 rows affected (0.087 sec)

MariaDB [mysql]> show create user root@localhost;
+-----------------------------------------------------------------------------------------------------------+
| CREATE USER for root@localhost                                                                            |
+-----------------------------------------------------------------------------------------------------------+
| CREATE USER `root`@`localhost` IDENTIFIED VIA ed25519 USING '비밀번호암호화된문자열' |
+-----------------------------------------------------------------------------------------------------------+
1 row in set (0.001 sec)

MariaDB [mysql]> select user, host, password, plugin from user where user = 'root';
+------+-----------+----------+---------+
| User | Host      | Password | plugin  |
+------+-----------+----------+---------+
| root | localhost |          | ed25519 |
+------+-----------+----------+---------+
1 row in set (0.004 sec)

MariaDB [mysql]>

 

새로 변경하는 비밀번호는 이전에 설치한 password validation 플러그인 영향을 받으므로 조건을 만족해야 합니다.

조건에 만족하지 않을 경우 에러가 발생합니다.

MariaDB [(none)]> alter user root@localhost identified via ed25519 using password('비밀번호삭제');
ERROR 1396 (HY000): Operation ALTER USER failed for 'root'@'localhost'


이제 새로 root 계정으로 접근하려고 하면 비밀번호 없이는 접속이 되지 않습니다.

변경후 root 계정으로 접근 하려면 반드시 비밀번호를 입력 해야 합니다.

$ sudo mysql -uroot
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

$ sudo mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 40
Server version: 11.4.3-MariaDB-1 Ubuntu 24.10

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

Support MariaDB developers by giving a star at https://github.com/MariaDB/server
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

지정한 비밀번호를 입력하여야 비로서 root 권한으로 MariaDB에 접속 할 수 있습니다.

하지만 sudo 권한이 없는 일반 계정으로도 MariaDB root 계정에 접속이 되는 것은 숙지 하셔야 합니다.

 

끝.

이전 글에서 비밀번호 검증 관련 플러그인설치 한것에 정책을 확인하고 적용해 보도록 하겠습니다.

 

Simple Password Check Plugin

기본 설정된 정책을 확인해 보겠습니다.

플러그인이 설치 되지 않았다면 https://opensrc.tistory.com/256 Simple Password Check 부분을 참고 해서 설치 하셔야 합니다.

MariaDB [(none)]> show global variables like 'simple_password%';
+-----------------------------------------+-------+
| Variable_name                           | Value |
+-----------------------------------------+-------+
| simple_password_check_digits            | 1     |
| simple_password_check_letters_same_case | 1     |
| simple_password_check_minimal_length    | 8     |
| simple_password_check_other_characters  | 1     |
+-----------------------------------------+-------+
4 rows in set (0.005 sec)

MariaDB [(none)]>

 

 

해당 플러그인을 설치한 이후에 기본 정책입니다.

  • 숫자 1자리 이상 (simple_password_check_digits=1)
  • 대/소문자 1자리 이상 (simple_password_check_letters_same_case=1)
  • 비밀번호 최소 길이 8자 이상 (simple_password_check_minimal_length=8)
  • 특수문자 1자리 이상 (simple_password_check_other_characters=1)

이전 쳅터 에서 정한 시나리오 대로 조금 더 강화해 도보록 하겠습니다.

  • 숫자 2자리 이상
  • 대/소문자 2자리 이상
  • 비밀번호 최소 길이 10자 이상
  • 특수문자 2자리 이상

포함으로 변경 하도록 하겠습니다.

온라인 가동중에 변경이 필요 하면 MariaDB 콘솔에서 아래와같이 설정합니다.

MariaDB [(none)]> set global simple_password_check_digits = 2;
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> set global simple_password_check_letters_same_case = 2;
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> set global simple_password_check_minimal_length = 10;
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> set global simple_password_check_other_characters = 2;
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> show global variables like 'simple_password%';
+-----------------------------------------+-------+
| Variable_name                           | Value |
+-----------------------------------------+-------+
| simple_password_check_digits            | 2     |
| simple_password_check_letters_same_case | 2     |
| simple_password_check_minimal_length    | 10    |
| simple_password_check_other_characters  | 2     |
+-----------------------------------------+-------+
4 rows in set (0.005 sec)

MariaDB [(none)]>

 

※ 이설정은 DB를 재시작 하게 되면 최기화 되므로 MariaDB 설정 파일 DB가동시 적용 될 수 있도록 기입 해줘야 합니다.

제가 설치한 버전은 설정 파일들이 /etc/mysql 존재 합니다.

$ ls -al /etc/mysql
total 32
drwxr-xr-x   4 root root 4096 Feb 25 18:26 .
drwxr-xr-x 110 root root 4096 Feb 25 00:51 ..
drwxr-xr-x   2 root root 4096 Feb 24 01:37 conf.d
-rwxr-xr-x   1 root root 1758 Aug 17  2024 debian-start
-rw-------   1 root root  544 Feb 24 01:38 debian.cnf
-rw-r--r--   1 root root 1324 Feb 25 18:26 mariadb.cnf
drwxr-xr-x   2 root root 4096 Feb 25 00:51 mariadb.conf.d
lrwxrwxrwx   1 root root   24 Oct 20  2020 my.cnf -> /etc/alternatives/my.cnf
-rw-r--r--   1 root root  839 Oct 20  2020 my.cnf.fallback
$

 

여러가지 상황에 따라 특정 상황에만 적용 하고 싶으면 mariadb.conf.d 디렉토리에 있는 파일에 기술하시고

이 케이스는 전체 MariaDB 데몬에 적용을 원하기 때문에 심볼릭 링크로 잡혀 있는 my.cnf 파일에 기술 하도록 하겠습니다.

$ sudo vi /etc/mysql/my.cnf
# The MariaDB configuration file
#
# The MariaDB/MySQL tools read configuration files in the following order:
# 0. "/etc/mysql/my.cnf" symlinks to this file, reason why all the rest is read.
# 1. "/etc/mysql/mariadb.cnf" (this file) to set global defaults,
# 2. "/etc/mysql/conf.d/*.cnf" to set global options.
# 3. "/etc/mysql/mariadb.conf.d/*.cnf" to set MariaDB-only options.
# 4. "~/.my.cnf" to set user-specific options.
#
# If the same option is defined multiple times, the last one will apply.
#
# One can use all long options that the program supports.
# Run program with --help to get a list of available options and with
# --print-defaults to see which it would actually understand and use.
#
# If you are new to MariaDB, check out https://mariadb.com/kb/en/basic-mariadb-articles/

#
# This group is read both by the client and the server
# use it for options that affect everything
#
[client-server]
# Port or socket location where to connect
# port = 3306
socket = /run/mysqld/mysqld.sock

[mysqld]
simple_password_check = on
simple_password_check_digits = 2
simple_password_check_letters_same_case = 2
simple_password_check_minimal_length = 10
simple_password_check_other_characters = 2

# Import all .cnf files from configuration directory
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mariadb.conf.d/
~
~
~
$

[mysqld] 포함 추가한 내용이 MariaDB 시작시 적용 되도록 했습니다.

순차적으로 적용 될 것 이기에 아래에 includedir 에 지정된 설정파일에서 해당 변수를 재정의를 한다면 재정의 된 값으로 설정 될 것 입니다.

 

Password Reuse Check Plugin

플러그인 설치후 초기 비밀번호 재사용 관련 초기값을 살펴 보겠습니다.

MariaDB [(none)]> show global variables like 'password_reuse%';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| password_reuse_check_interval | 0     |
+-------------------------------+-------+
1 row in set (0.006 sec)

MariaDB [(none)]>

 

0으로 설정되어 있는 것은 비밀번호 재상용을 체크하지 않겠다는 의미 입니다.

password_reuse_check_interval 값은 사용한 비밀번호 기록 기간을 일자로 제한합니다.

이 값이 0이면 한번 사용한 비밀번호는 영구히 사용할 수 없습니다.

이 값을 3으로 설정하면 한번 사용한 비밀번호는 3일동안 사용 할 수 없습니다

 

온라인 가동중에 변경이 필요하면 아래와 같이 적용합니다.

MariaDB [(none)]> set global password_reuse_check_interval = 3;
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> show global variables like 'password_reuse%';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| password_reuse_check_interval | 3     |
+-------------------------------+-------+
1 row in set (0.006 sec)

MariaDB [(none)]>

 

이것 역시 DB가 재 가동되면 Default 값(0)으로 초기화 되므로 my.cnf에 추가해 줘야 합니다.

$ sudo vi /etc/mysql/my.cnf
# The MariaDB configuration file
#
# The MariaDB/MySQL tools read configuration files in the following order:
# 0. "/etc/mysql/my.cnf" symlinks to this file, reason why all the rest is read.
# 1. "/etc/mysql/mariadb.cnf" (this file) to set global defaults,
# 2. "/etc/mysql/conf.d/*.cnf" to set global options.
# 3. "/etc/mysql/mariadb.conf.d/*.cnf" to set MariaDB-only options.
# 4. "~/.my.cnf" to set user-specific options.
#
# If the same option is defined multiple times, the last one will apply.
#
# One can use all long options that the program supports.
# Run program with --help to get a list of available options and with
# --print-defaults to see which it would actually understand and use.
#
# If you are new to MariaDB, check out https://mariadb.com/kb/en/basic-mariadb-articles/

#
# This group is read both by the client and the server
# use it for options that affect everything
#
[client-server]
# Port or socket location where to connect
# port = 3306
socket = /run/mysqld/mysqld.sock

[mariadb]
simple_password_check = on
simple_password_check_digits = 2
simple_password_check_letters_same_case = 2
simple_password_check_minimal_length = 10
simple_password_check_other_characters = 2

password_reuse_check_interval = 3

# Import all .cnf files from configuration directory
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mariadb.conf.d/
$

 

Cracklib Password Check Plugin

별도의 추가 설정 필요 없음

 

 

다음 편에는 실제 사용자를 생성하고 권한을 부여해보도록 하겠습니다.

 

끝.

 

이전 페이지에서 필요한 플러그인 설치는 완료 했습니다.

https://opensrc.tistory.com/256

 

[MariaDB] 보안취약점 점검 #2 비밀번호 알고리즘 개선 - 플러그인 설치

MariaDB에서 제공하는 주요 비밀번호 보안 관련 플러그인 적용https://mariadb.com/kb/en/password-validation-plugins/ Password Validation Plugins mariadb.com사전준비내가 설치한 DB의 플러그인 디렉토리를 확인하고 현

opensrc.tistory.com

 

이제 가상으로 보안에 대한 시나리오를 잡아 보고 그것을 적용해 보도록 하겠습니다.

 

시나리오

보통 보안취약점 점검에 체크리스트는 아래와 같이 나옵니다.

  • 사용자 계정의 비밀번호의 복잡도를 일정 수준 이상으로 강제 하고 있는가?
  • 사용자 계정의 비밀번호는 안전한 알고리즘을 이용하고 있는가?
  • 사용자 계정의 비밀번호 만료 기간을 강제 하고 있는가?
  • 개인정보 시스템은 외부에서 접근 불가능한 공간에 안전하게 운영되고 있는가?
  • 개별 사용자를 분리하여 계정을 부여하고 사용자의 롤에 따라 권한을 다르게 부여하고 있는가?
  • 개인정보 컬럼은 암호화되어 저장되고 있는가?
  • 개인정보를 조회(다운로드)등 하는 경우를 제한 하거나 모니터링 하고 있는가?
  • DATA 백업은 정기적으로 이뤄 지고 있는가?

현장 실사에 위와 같은 내용을 중심으로 증빙해서 해당 사항이 없거나 미흡하면 수정 후 조치 결과 증적을 제출 하는 식으로 수행 됩니다.

 

비밀번호

  • 최소 숫자 2자리 포함
  • 최소 대/소문자 2자리 포함
  • 최소 특수문자 2자리 포함
  • 비밀번호 최소 길이 10자리 이상
  • 유추하기 쉬운 비밀번호 사용 금지
  • 사용한 비밀번호 직전 3회 재사용 사용 제한
  • 비밀번호 유효기간 90일
  • 안전한 비밀번호 알고리즘 사용 (md5, sha1 같은 취약한 알고리즘 불가)

 

계정 및 접근 관리

  • 개인별 계정 및 IP 할당
  • 개인 계정 별 권한 차등 부여

 

데이터 암호화

  • 개인정보가 포함된 컬럼의 암호화

 

감사관리

  • 개인 계정 접근 이력에 대한 주기적 보안감사

데이터백업

  • 데이터를 정기적으로 백업 및 안전한 공간에 소산 보관

 

이 정도 시나리오를 가지고 순서대로 진행해 보도록 하겠습니다.

 

끝.

 

 

 

MariaDB에서 제공하는 주요 비밀번호 보안 관련 플러그인 적용

https://mariadb.com/kb/en/password-validation-plugins/

 

Password Validation Plugins

 

mariadb.com

 

사전준비

내가 설치한 DB의 플러그인 디렉토리를 확인하고 현재 설치된 플러그인을 살펴 보겠습니다.

 

현재 설치된 플러그인 확인

MariaDB [mysql]> show plugins;
+-------------------------------+----------+---------------------+----------------------------+---------+
| Name                          | Status   | Type                | Library                    | License |
+-------------------------------+----------+---------------------+----------------------------+---------+
| binlog                        | ACTIVE   | STORAGE ENGINE      | NULL                       | GPL     |
| mysql_native_password         | ACTIVE   | AUTHENTICATION      | NULL                       | GPL     |
| mysql_old_password            | ACTIVE   | AUTHENTICATION      | NULL                       | GPL     |
... 생략 ...
| partition                     | ACTIVE   | STORAGE ENGINE      | NULL                       | GPL     |
+-------------------------------+----------+---------------------+----------------------------+---------+
80 rows in set (0.005 sec)

MariaDB [mysql]>

 

플러그인 디렉토리 위치 확인

MariaDB [mysql]> show global variables like 'plugin_dir%';
+---------------+------------------------+
| Variable_name | Value                  |
+---------------+------------------------+
| plugin_dir    | /usr/lib/mysql/plugin/ |
+---------------+------------------------+
1 row in set (0.005 sec)

MariaDB [mysql]>

 

다운로드 된 플러그인 확인

$ ls -al /usr/lib/mysql/plugin
total 2456
drwxr-xr-x 3 root  root   4096 Feb 25 15:10 .
drwxr-xr-x 3 root  root   4096 Feb 24 01:37 ..
-rw-r--r-- 1 root  root  99560 Aug 19  2024 auth_ed25519.so
-rw-r--r-- 1 root  root  68000 Aug 19  2024 auth_pam.so
drwx------ 2 mysql root   4096 Feb 24 01:37 auth_pam_tool_dir
-rw-r--r-- 1 root  root  67992 Aug 19  2024 auth_pam_v1.so
-rw-r--r-- 1 root  root  67816 Aug 19  2024 disks.so
-rw-r--r-- 1 root  root  68160 Aug 19  2024 file_key_management.so
-rw-r--r-- 1 root  root 133640 Aug 19  2024 ha_archive.so
-rw-r--r-- 1 root  root 133544 Aug 19  2024 ha_blackhole.so
-rw-r--r-- 1 root  root 133584 Aug 19  2024 ha_federated.so
-rw-r--r-- 1 root  root 199200 Aug 19  2024 ha_federatedx.so
-rw-r--r-- 1 root  root 199248 Aug 19  2024 ha_sphinx.so
-rw-r--r-- 1 root  root 200376 Aug 19  2024 handlersocket.so
-rw-r--r-- 1 root  root  67816 Aug 19  2024 locales.so
-rw-r--r-- 1 root  root  67896 Aug 19  2024 metadata_lock_info.so
-rw-r--r-- 1 root  root  67928 Aug 19  2024 password_reuse_check.so
-rw-r--r-- 1 root  root  67504 Aug 19  2024 provider_bzip2.so
-rw-r--r-- 1 root  root  67504 Aug 19  2024 provider_lz4.so
-rw-r--r-- 1 root  root  67664 Aug 19  2024 provider_lzma.so
-rw-r--r-- 1 root  root  67504 Aug 19  2024 provider_lzo.so
-rw-r--r-- 1 root  root  67504 Aug 19  2024 provider_snappy.so
-rw-r--r-- 1 root  root  67816 Aug 19  2024 query_cache_info.so
-rw-r--r-- 1 root  root  68208 Aug 19  2024 query_response_time.so
-rw-r--r-- 1 root  root  71976 Aug 19  2024 server_audit.so
-rw-r--r-- 1 root  root  68128 Aug 19  2024 simple_password_check.so
-rw-r--r-- 1 root  root  68344 Aug 19  2024 sql_errlog.so
-rw-r--r-- 1 root  root 133552 Aug 19  2024 type_mysql_json.so
-rw-r--r-- 1 root  root  68016 Aug 19  2024 wsrep_info.so
$

 

 

확인해 보면 MariaDB가 설치 되면서 기본적으로 이후 설명할 세가지 플러그인의 so 파일이 함께 설치 되지만 활성화가 되지 않은 상태입니다.

이번 페이지에서는 각각 용도에 대해 알아보고 플러그인 설치 까지만 진행하도록 하겠습니다.

 

Simple Password Check

기본적인 비밀번호 복잡도를 강제하는 용도 입니다.

  • 숫자 n자리 이상 포함 : simple_password_check_digits
  • 대문자, 소문자 n자리 이상 포함  :  simple_password_check_letters_same_case
  • 비밀번호 최소 길이  :  simple_password_check_minimal_length
  • 특수 문자 n자리 이상 포함  :  simple_password_check_other_characters
  • 참고1 : https://mariadb.com/kb/en/simple-password-check-plugin/
  • 참고2 :마리아 DB 10.1.2 에서 알파버전이 최초 적용 되었습니다만, 참고1 페이지에 보면 10.4.0 이전 버전에서는 password validation plugins와 충돌이 될 수도 있다는 내용을 참고 하시기 바랍니다.

플러그인 파일 확인

$ ls -al /usr/lib/mysql/plugin/*.so | grep simple
-rw-r--r-- 1 root root  68128 Aug 19  2024 /usr/lib/mysql/plugin/simple_password_check.so
$

 

플러그인 설치

MariaDB [(none)]> install soname 'ed25519';
Query OK, 0 rows affected (0.009 sec)

MariaDB [(none)]>

 

플러그인 설치 결과 확인

MariaDB [mysql]> show plugins;
+-------------------------------+----------+---------------------+----------------------------+---------+
| Name                          | Status   | Type                | Library                    | License |
+-------------------------------+----------+---------------------+----------------------------+---------+
... 생략 ...
| simple_password_check         | ACTIVE   | PASSWORD VALIDATION | simple_password_check.so   | GPL     |
... 생략 ...
+-------------------------------+----------+---------------------+----------------------------+---------+
80 rows in set (0.005 sec)

MariaDB [mysql]>

 

Password Reuse Check

비밀번호 변경시 이전 비밀번호를 사용하지 못하게 하는 플러그인 입니다.

MariaDB 10.7.0 부터 기본 설치되는 플러그인 입니다.

 

플러그인 파일 확인

$ ls -al /usr/lib/mysql/plugin | grep reuse
-rw-r--r-- 1 root  root  67928 Aug 19  2024 password_reuse_check.so
$

 

플러그인 설치

MariaDB [(none)]> install soname 'password_reuse_check';
Query OK, 0 rows affected (0.009 sec)

MariaDB [(none)]>

 

플러그인 설치 결과 확인

MariaDB [mysql]> show plugins;
+-------------------------------+----------+---------------------+----------------------------+---------+
| Name                          | Status   | Type                | Library                    | License |
+-------------------------------+----------+---------------------+----------------------------+---------+
... 생략 ...
| password_reuse_check          | ACTIVE   | PASSWORD VALIDATION | password_reuse_check.so    | GPL     |
... 생략 ...
+-------------------------------+----------+---------------------+----------------------------+---------+
80 rows in set (0.005 sec)

MariaDB [mysql]>

 

ed25519

사용자계정의 비밀번호 저장에 타원곡선 디지털 서명 알고리즘(ECDSA)을 사용할 수 있습니다.

  • MariaDB 에서는 기본적으로 비밀번호 저장에 보안에 취약한 sha1 해쉬방식을 고수하고 있습니다. 이것은 MariaDB를 대상으로 하는 보안취약점 점검에 가장먼저 체크 대상이 될 것입니다.
  • MariaDB 에서는 이를 보안하기 위해 타원곡선 암호화(ECC)기반으로 하는 ed25519 알고리즘을 플러그인 형태로 제공합니다.
  • MariaDB 10.4 이상과 이전 버전에서 각각 적용 방법이 다릅니다. 자세한 내용은 다음회에 암호를 생성하면서 알아 보겠습니다.
  • 참고1 : https://mariadb.com/kb/en/password/
  • 참고2 : https://mariadb.com/kb/en/set-password/
  • 참고3 : https://mariadb.com/kb/en/authentication-plugin-ed25519/

플러그인 파일 확인

$ ls -al /usr/lib/mysql/plugin/*.so | grep ed25519
-rw-r--r-- 1 root root 99560 Aug 19  2024 /usr/lib/mysql/plugin/auth_ed25519.so
$

 

플러그인 설치

MariaDB [(none)]> install soname 'ed25519';
Query OK, 0 rows affected (0.009 sec)

MariaDB [(none)]>

 

플러그인 설치 결과 확인

MariaDB [mysql]> show plugins;
+-------------------------------+----------+---------------------+----------------------------+---------+
| Name                          | Status   | Type                | Library                    | License |
+-------------------------------+----------+---------------------+----------------------------+---------+
... 생략 ...
| ed25519                       | ACTIVE   | AUTHENTICATION      | auth_ed25519.so            | GPL     |
... 생략 ...
+-------------------------------+----------+---------------------+----------------------------+---------+
80 rows in set (0.005 sec)

MariaDB [mysql]>

 

Server Audit

플러그인 파일 확인

$ ls -al /usr/lib/mysql/plugin/*.so | grep audit
-rw-r--r-- 1 root root 71976 Aug 19  2024 /usr/lib/mysql/plugin/server_audit.so
$

 

플러그인 설치

MariaDB [(none)]> install soname 'server_audit';
Query OK, 0 rows affected (0.015 sec)

MariaDB [(none)]>

 

플러그인 설치 확인

MariaDB [(none)]> show plugins;
+-------------------------------+----------+---------------------+--------------------------+---------+
| Name                          | Status   | Type                | Library                  | License |
+-------------------------------+----------+---------------------+--------------------------+---------+
... 생략 ...
| SERVER_AUDIT                  | ACTIVE   | AUDIT               | server_audit.so          | GPL     |
+-------------------------------+----------+---------------------+--------------------------+---------+
74 rows in set (0.005 sec)

MariaDB [(none)]>

 

Cracklib Password Check Plugin

예측하기 쉬운 단어로 비밀번호를 사용하지 못하도록 하는 플러그인으로 기본 제공 플러그인은 아닙니다.

OS레벨의 pam_cracklib 를 이용하는 것으로 패키지 관리자를 통해서 추가로 설치 해야 합니다.

 

pam_cracklib 설치

$ sudo apt install mariadb-plugin-creaklib-password-check

RedHat, CentOS 게열이면 yum 으로 설치 하시면 됩니다.

더보기
더보기
$ sudo yum install MariaDB-cracklib-password-check

lib를 설치 하면 MariaDB 플러그인 디렉토리에 so파일이 다운로드 됩니다.

 

플러그인 파일 확인

$ ls -al /usr/lib/mysql/plugin | grep cracklib
-rw-r--r-- 1 root  root  67752 Aug 19  2024 cracklib_password_check.so
$

 

플러그인 설치

MariaDB [(none)]> install soname 'cracklib_password_check';
Query OK, 0 rows affected (0.048 sec)

MariaDB [(none)]>

 

플러그인 설치 확인

MariaDB [(none)]> show plugins;
+-------------------------------+----------+---------------------+----------------------------+---------+
| Name                          | Status   | Type                | Library                    | License |
+-------------------------------+----------+---------------------+----------------------------+---------+
... 생략 ...
| cracklib_password_check       | ACTIVE   | PASSWORD VALIDATION | cracklib_password_check.so | GPL     |
+-------------------------------+----------+---------------------+----------------------------+---------+
81 rows in set (0.005 sec)

MariaDB [(none)]>

 

MariaDB 공식 페이지에서는 해당 플러그인을 설치후 my.cnf 파일에 플러그인 로드 스크립트를 함께 적어줘야 한다고 나오지만 MariaDB 11.4.3 기준으로 테스트 해보면 해당 플러그인들은 설치 후 즉시 적용 되며,  conf 파일에 별다른 추가를 하지 않아도 DB 재가동 후에도 적용되는 것을 확인 했습니다.

 

다음 편에는 보안 시나리오를 정하고 플러그인 설정을 통해 그것을 적용해 보도록 하겠습니다.

 

 

서비스 중 개인정보를 DB에 저장하는 경우 여러가지 보안 조치가 필요 합니다.

그동안 실무에서 보안취약점 점검 수행 경험상 자주 등장했던 요구사항에 대한 내용 및 조치방법을 정리 해 보았습니다.

 

제가 제가 경험했던 5년간의 사례는 메이저 통신 3사, 약 15개 정도의 금융사와 개인정보 위/수탁관계로 거의 1한달에 한번씩 돌아가며 보안취약점 점검을 나오는 경험이 있었습니다.

 

애초에 설계를 신경써서 했음에도 불구하고 아예 대응이 비용, 시간 문제로 현실적으로 불가능한 경우도 있었고 서비스를 운영하고 있는 상황에서 적용하기가 매우 부담스러운 상황이 대부분 이었습니다.

 

애초에 개인정보처리시스템의 정의를 Back Office 어플리케이션으로 하지 않고 DBMS로 한정하였습니다.

그렇게 하기 위해서 Back Office에는 개인정보를 노출 하는 곳이 아예 없었습니다.

우리는 개인정보처리시스템이 없다는 단순한 논리로 막아질 줄 알았는데, 예상치 못하게 DBMS의 보안사항을 좀더 타이트하게 보는 당연한(?) 결과가 나와서 두고 두고 더욱 애를 먹었습니다.

BackOffcie 어플리케이션의 경우 시간과 공수를 들어스 그렇지 유연성이 있어서 권고사항을 검토해서 합당하면 그대로 고치면 되는데 DBMS는 직접 고치거나 플러그인을 개발 하기가 쉽지 않은 상항이다보니 더욱 그랬습니다.

 

MariaDB기준으로 개인정보처리시스템 보안취약점 검검에 자주 등장하는 내용을 살펴보고 이것을 어떻게 처리해야 하는지, 정리를 해보고자 합니다.

 

 

0. 준비

MariaDB 10.7.0 이상이 필요 합니다. 그 이전 버전에서는 몇가지 보안플러그인을 지원하지 않아서 기본 적인 것만 해야 합니다.

기존 운영 시스템이라면 어쩔 수 없지만, 새로 설치하는 것 이라면 10.7이상 버전을 설치하는게 좋습니다.

 

이 글에서는 Ubuntu 24.10, MariaDB 11.4.3 기반으로 테스트 하였습니다.

 

1. 보안을 고려한 물리적 구성  및 HA(고가용성) 구성

1.1 방화벽

서비스 네트워크 구성에는 반드시 방화벽이 필요 합니다.

방화벽이 없이 서버만을 배치하고 일반적인 배포판을 설치한다면 1달 이내에 IDC에서 연락이 올 것이며

우리의 서버는 DDOS 노드로 전락하여 수많은 트래픽을 발생 시킬 수 있습니다.

한번 침입을 받은 시스템은 높은 확률로 백도어가 설치되어 있을 가능성이 있기 때문에 원인을 찾아서 제거하는 것 보다

서비스를 중단하고 새로 설치하는 것이 더 안전하고 시간과 비용이 적게 든다고 생각합니다.

방화벽, 침임탐지시스템, 웹방화벽등 여러가지 보안 시스템을 앞단에 둘 수 있지만 비용이 많이 드는 것을 고려해도 최소한 방화벽은 꼭 있어햐 합니다.

방화벽은 기본적으로 inbound는 모두 차단후 필요한 포트와 IP만을 허용하는 방식으로 설정해야 합니다.

 

1.2 망분리

DB는 기본적으로 물리적인 네트워트에서 외부와 고립되어 있는 것이 좋습니다.

외부에서의 다이렉트로 DB에 접근은 불가하도록 물리적으로 구성합니다.

App/API 서버 기준으로 공인망(Public Network)와 내부망(Private Network)로 나누고 DB서버는 App/API 서버를 통해서만 접근 할 수 있도록 분리 해야 합니다.

DB서버에서 공인망으로 접근 역시 차단되어 있기에 DB서버가 내부망에 고립되어 있다는 점은 유지보수에 매우 불편한 점이 있습니다.

많은 경우에 내부망과 개발/운영 조직간에 사설망을 설치해서 쓰기도 하고, VPN을 구성해서 특정 위치에서만 접근 가능하도록 구성을 하기도 합니다.

과거에는 VPN을 사용하는 방식이 사설망을 다이렉트로 연결 하는 것보다 보안에 취약하다는 견해가 있었으나

요즘 AWS 같은 클라우드 서비스가 활성화 되면서 VPN 방식도 유연하게 봐주는 편인것 같습니다.

 

1.3 HA(고가용성) 구성

전통적인 HA 구성방식은 두대 이상의 DB서버를 구성하고 한쪽으로만 서비스(Active)를 하면서 변동되는 Data를 대기중인 서버(Standby)로 복제 해주는 방식입니다.

안정적이고 Active 서버에 장애가 발생했을때 빠른 시간안에 Standby로 대체헤서 서비스를 할 수 있습니다.

하지만 대부분 고사양 하드웨어로 구성되는 DB서버의 특성상 장애가 발생하기 전 까지 계속 대기만 하고 있어야 한다는 점은 퍼포먼스 관점에서 본다면 매우 아까운 비용입니다.

그래서 요즘은 Active(Read-Write) - Active(Read Only) 구성으로도 많이 구성하는 편 입니다.

서버 두대를 모두 놀리지 않고 쓸 수 있다는 장점이 있지만

어플리케이션에서 읽기/쓰기 요청과 읽기 요청을 분리해서 호출해야 하기 때문에 서비스 개발에 복잡도가 올라가는 경향이 있습니다.

현실적으로 DB서버 여러대가 동시에 같은 스토리지를 접근해서 Read/Write Access를 할 수 있는 RDBMS는 현재 기준 Oracle Enterprise Edition RCA에서만 가능합니다.

기업들이 비싸도 Oracle를 사용할 수 밖에 없는 큰 이유라고 생각합니다.

MariaDB가 오픈소스 기반이지만  MariaDB의 특성을 잘 이해하고 운영한다면 상용 RDBMS 못지 않은 성능과 안정성을 보여준다고 생각합니다.

고가용성 관련 내용은 원래 주제와 벗어나므로 안정적인 운영을 위해 2중화 구성이 필요하다는 관점만 이해 하고 넘어가는게 좋겠습니다.

 

2. 보안 취약점 점검

보안취약점 점검에 단골로 등장하는 항목입니다.

  • 개별 사용자를 분리하여 계정을 부여하고 사용자의 롤에 따라 권한을 다르게 부여하고 있는가?
  • 사용자 계정의 비밀번호는 안전한 알고리즘을 이용하고 있는가?
  • 사용자 계정의 비밀번호 만료 기간을 강제 하고 있는가?
  • 사용자 계정의 비밀번호의 복잡도를 일정 수준 이상으로 강제 하고 있는가?
  • 개인정보 시스템은 외부에서 접근 불가능한 공간에 안전하게 운영되고 있는가?
  • 개인정보 컬럼은 암호화되어 저장되고 있는가?
  • 개인정보를 조회(다운로드)등 하는 경우를 제한 하거나 모니터링 하고 있는가?
  • DATA 백업은 정기적으로 이뤄 지고 있는가?

이외에도 점검 항목이 많겠지만 비용을 들이지 않고 쉽게 적용 할 수 있는 부분을 중심으로 정리 해보겠습니다.

 

3. 결론

보안 이라는 것이 끝이 없고 하면 할 수록 비용이 들고, 불편해 지며 성능이 떨어질 수 밖에 없습니다.

다음에는 위에 취약점 점검 항목에 대해 확인 및 MariaDB 자체의 기능으로 실무에서 어떻게 적용하는지 실습을 해보도록 하겠씁니다.

 

끝.

 

아래 블로그 내용을 참고 하였습니다.

https://intotherealworld.tistory.com/59

감사합니다.

 

JAVA 자체는 C기반으로 만들어져 있기 때문에 CPU에 따라 다른 바이너리를 받아야 합니다.

어떤 것을 받아야 하는지 확인 하기 위해 CPU 아키텍쳐를 확인해야 합니다.

$ uname -m
aarch64

라즈베리파이 CPU는 ARM 계열임을 확인 할 수 있습니다.

인텔칩 기반에 우분투를 설치 했다면 x86_?? 같은 문자열이 출력 될 것입니다.

(시스템의 CPU 아키텍쳐를 확인하는 방법 ☞ https://www.sangchul.kr/831)

 

JDK 21 릴리즈 ☞ https://github.com/adoptium/temurin21-binaries/releases

설치 일자 기준 21.0.5_11 버전 릴리즈(2024.10. 17)가 최신 인 것 같습니다.

다운로드 링크에 오른쪽 마우스클릭 해서 링크 주소를 복사 해서 설치할 기기에 다운 받습니다.

$ wget https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.5%2B11/OpenJDK21U-jdk_aarch64_linux_hotspot_21.0.5_11.tar.gz

 

다운로드가 완료 되었으면 압축을 해제 합니다.

$ tar zxvf OpenJDK21U-jdk_aarch64_linux_hotspot_21.0.5_11.tar.gz

 

압축 해제가 완료 되었으면 배치할 디렉토리로 옮겨 줍니다.

여기서는 /usr/local/jvm 아래에 배치 하고 alternative 패키지 관리자로 JDK 버전 관리를 할 예정입니다. (본인이 원하는 디렉토리를 선택 해도 무방하고 기존에 JVM이 설치 되어 있다면 그곳에 같이 배치 하는 것이 장기적으로 관리에 도움이 될 것 입니다.)

이렇게 하면 필요에 따라 여러개 버전의 JVM 을 배치해서 여러개의 Java 버전을 동시에 쓸 수 있는 장점이 있습니다.

$ sudo mkdir /usr/local/jvm

참고 1. /usr/local 디렉토리는 root의 소유이기 때문에 디렉토리를 만들 때 super user 권한으로 만들어 줘야 합니다.

참고 2. jvm은 보안 문제로 root 소유로 하지 않는 것을 권장하기 때문에 해당 디렉토리는 향후 어플리케이션을 관리할 계정에게 소유를 넘기는 것이 좋습니다.

참고 3. 기존에 사용하던 것의 소유권을 변경 하는 것은 안정성에 문제가 없는지 충분히 검토를 한 후 변경하시길 권합니다.

$ sudo chown -R 사용자계정:사용자그룹 /usr/local/jvm
$ ls -al /usr/local
total 48
drwxr-xr-x 12 root      root      4096 Feb 23 21:49 .
drwxr-xr-x 11 root      root      4096 Oct  8 02:11 ..
drwxr-xr-x  2 root      root      4096 Oct  8 02:11 bin
drwxr-xr-x  2 root      root      4096 Oct  8 02:11 etc
drwxr-xr-x  2 root      root      4096 Oct  8 02:11 games
drwxr-xr-x  2 root      root      4096 Oct  8 02:11 include
drwxr-xr-x  2 사용자계정 사용자그룹 4096 Feb 23 21:49 jvm
drwxr-xr-x  3 root      root      4096 Oct  8 02:12 lib
drwxr-xr-x  2 root      root      4096 Oct  8 02:11 libexec
lrwxrwxrwx  1 root      root         9 Oct  8 02:11 man -> share/man
drwxr-xr-x  2 root      root      4096 Oct  8 02:11 sbin
drwxr-xr-x  6 root      root      4096 Oct  8 02:12 share
drwxr-xr-x  2 root      root      4096 Oct  8 02:11 src
$

 

압축을 해제한 JDK 이동

$ ls
OpenJDK21U-jdk_aarch64_linux_hotspot_21.0.5_11.tar.gz  jdk-21.0.5+11
$ mv jdk-21.0.5+11 /usr/local/jvm
$ ls /usr/local/jvm
jdk-21.0.5+11
$

 

이제 JDK를 사용 할 수 있도록 alternative로 패키지 관리 설정을 하겠습니다.

$ sudo update-alternatives --install /usr/bin/java java /usr/local/jvm/jdk-21.0.5+11/bin/java 1
$ sudo update-alternatives --install /usr/bin/javac javac /usr/local/jvm/jdk-21.0.5+11/bin/javac 1

 

등록된 패키지 확인

$ sudo update-alternatives --config java
There is 1 choice for the alternative java (providing /usr/bin/java).

  Selection    Path                                   Priority   Status
------------------------------------------------------------
* 0            /usr/local/jvm/jdk-21.0.5+11/bin/java   1         auto mode
  1            /usr/local/jvm/jdk-21.0.5+11/bin/java   1         manual mode

Press <enter> to keep the current choice[*], or type selection number:
$

아무것도 없는 빈깡통에 설치를 했으므로 방금 등록한 java만 리스트에 나옵니다.

 

버전 확인

$ java -version
openjdk version "21.0.5" 2024-10-15 LTS
OpenJDK Runtime Environment Temurin-21.0.5+11 (build 21.0.5+11-LTS)
OpenJDK 64-Bit Server VM Temurin-21.0.5+11 (build 21.0.5+11-LTS, mixed mode, sharing)
$ javac -version
javac 21.0.5
$

 

환경변수 등록 (필요에 따라 하세요)

$ sudo vi /etc/profile
export JAVA_HOME=/usr/local/jvm/jdk-21.0.5+11
export PATH=$PATH:$JAVA_HOME/bin
... 생략 ...

맨위에 추가 했습니다.

 

재로그인 하거나 /etc/profile를 재로드 하고 제대로 반영 되었는지 확인해 봄니다.

$ source /etc/profile
$ echo $JAVA_HOME
/usr/local/jvm/jdk-21.0.5+11
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/jvm/jdk-21.0.5+11/bin

 

간단한 프로그램을 작성해서 제대로 컴파일이 되고 실행이 되는지 확인해 보겠습니다.

$ vi HelloWorld.java
public class HelloWorld {
        public static void main(String [] args) {
                System.out.println("Hello World!");
        }
}
~
~
~
$ javac -d . HelloWorld.java
$ ls
HelloWorld.class  HelloWorld.java
$ java HelloWorld
Hello World!
$

컴파일도 잘 되고 실행도 잘 되고 있습니다.

 

끝.

Volumio를 설치 한 후 어느 단계에선가 플러그인 메뉴에 들어가면 로그인이 필요하다는 메시지가 나오고

로그인 화면으로 이동하면 이미 로그인이 되어 있는 상태로 반복됨

 

나의 경우는 IP 변경 되는 것을 를 고정하기 위해 /etc/dhcpcd.conf에 static IP를 지정해서 발생한 문제로

볼루미오측에서도 정확한 원인은 모르는 듯? (추정)

 

dhcpcd.conf 에 static ip 지정하는 부분을 모두 삭제하고 재부팅해서 dhcp ip를 할당 받은 후 정상 작동 됨

라즈베리파이 OS가 2023년 하반기에 bookworm 버전이 배포 된것 같습니다.

네이밍은 토이스토리에서 따온 것이라고 합니다.

https://2youngmaan.tistory.com/7

 

Docker 이미지 종류: Bullseye, Bookworm, Slim의 차이

도커 베이스 이미지가 필요해서 찾던 중에 이미지 태그에 여러 종류가 있어서 찾아본 것들을 정리해 본다.Debian의 태그명은 "토이 스토리" 시리즈의 캐릭터 이름에서 따오는게 전통이라고 한다

2youngmaan.tistory.com

 

나의 배포판 확인 방법

 

 

 

고정 IP 할당 하는 방식도 기존 bullseye에서  /etc/dhcpcd.conf 에 기술하던게 것이 더이상 사용되지 않고

nmcli 라는 명령으로 인터페이스를 관리 해야 한다고 합니다.

더보기

/etc/dhcpcd.conf 의 wifi 고정 IP 관련 설정 방법

... 생략

#
interface wlan0
static ip_address=192.168.45.10/24
static router=192.168.45.1
static domain_name_server=8.8.8.8 1.1.1.1
static netmask=255.255.255.0

failback
dhcp

... 생략

 

nmcli 네트워크 설정 참고 https://easyitwanner.tistory.com/113

 

[Linux 명령어] 네트워크 설정을 변경하는 3가지 방법 (nmtui, nmcli, vi)

목차 nmtui와 nmcli nmcli 명령어 예시 nmtui 활용 예시 vi 명령어 활용 nmtui와 nmcli Linux에서 nmtui 및 nmcli는 네트워크 연결을 관리하는 데 사용되는 두 가지 명령어다. Nmcli(NetworkManager Command-Line Interface) Nm

easyitwanner.tistory.com

 

 

 

여러대의 라즈베리파이를 굴리는 경우 수시로 변경 되는 IP를 IP 스캐너 같은 것으로 매번 찾기는게 귀찮아서 고정 IP를 할당하기로 했습니다.

 

네트워크 인터페이스를 조작 하는 것이라 잘 못 한다면 SSH 연결이 안되서 콘솔에 모니터, 키보드를 연결해서 상태를 보지 않고는 수정할 방법이 없으니 기존에 사용하던 장비라면 신중하게 작업 하시기 바랍니다.

 

라즈베리파이를 설치하고 기본 wifi 연결, SSH 접속이 가능한 상태에서 작업 했습니다.

먼저 할당할 IP및 네트워크 정보를 확보 하고 기존에 연결된 wifi 정보를 알아야 합니다.

ifconfig 명령으로 알 수 있습니다.

wifi 연결로 잡혀 있으므로 인터페이스명은 wlan0, 현재 DHCP로 할당된 IP는 192.168.45.100, 서브넷마스크는 255.255.255.0 입니다.

디폴트 라우터(집이라면 공유기 IP)가 필요 합니다.

netstat, route 등의 명령으로 확인 할 수 있습니다.

모든 요청 (0.0.0.0)이 192.168.45.1을 통해 나가도록 설정되어 있습니다.

DNS는 구글1차(8.8.8.8)로 하겠습니다. (지정하지 않으면 DHCP서버가 자동으로 할당합니다.)

 

먼저 현재 네트워크 상태를 확인

$ nmcli con show

라즈베리파이 설치 하면서 자동으로 지정된 내용입니다.

 

정리 해보면

  • Interface Name : preconfigured
  • Type : wifi
  • Device Name : wlan0
  • Default Gateway : 192.168.45.1
  • Subnet Mask : 255.255.255.0
  • Static IP : 192.168.45.10/24 (24는 C클래스 네트워크 마스크비트를 표현합니다.)

이제 기존 preconfigured 연결에 IP를 고정해 보겠습니다.

$ sudo nmcli con mod preconfigured ipv4.method manual ipv4.dns 8.8.8.8 ipv4.gateway 192.168.45.1 ipv4.addresses 192.168.45.10/24

 

신텍스 오류가 없으면 아무 메시지도 나오지 않습니다.

심지어 오타가 있어서 오타가 있어도 명령어 신텍스만 맞으면 등록이 됩니다.

어짜피 IP가 변경되면 연결이 정상적이이 않을 것이니(기존 연결은 살아있나? ㅎ)

 

재부팅~

 

변경된 IP로 접속해서 확인

잘 변경 되었습니다.

 

 

기타 wifi를 새로 등록 하면서 SSID, 비밀번호 등을 등록 하는 방법 등 nmcli 명령에 대해 조금 더 알아 보고 싶으신분은

https://docs.redhat.com/ko/documentation/red_hat_enterprise_linux/7/html/networking_guide/sec-adding_a_wi-fi_connection_with_nmcli#sec-Adding_a_Wi-Fi_Connection_with_nmcli

 

3.3.10. nmcli를 사용하여 Wi-Fi 연결 추가 | Red Hat Product Documentation

형식멀티 페이지단일 페이지모든 문서를 PDF로 표시

docs.redhat.com

 

기기가 많아 질 수록 어떤 서비스를 어떤 IP에 할당했는지 외우거나 머리가 안되면 리스트를 문서로 관리하는 것도 방법입니다.

참고 하세요

 

끝.

 

준비물

1. Raspbarry Pi 4B 4G

    ※ 3B 모델로도 동일하게 작업 했었으니 남아 도는 3B로 해도 좋을듯

 

2. DAC : IQAudio DAC Pro (https://www.devicemart.co.kr/goods/view?no=13237161)

    ※ 라즈베리파이 만으로도 가능하지만 이왕 만드는거 좋은 음질을 위해 가성비 평이 좋은 IQAudio DAC 보드 추가

 

3. Display : 라즈베리파이용 3.5인치 TFT 디스플레이 (https://www.devicemart.co.kr/goods/view?no=1376592)

    ※ 현재 재생되는 곡 정보가 표시되면 더 좋을 듯 해서 추가 했지만, 라즈베리안 OS에서 기본으로 드라이버를 제공하지

        않아서 드라이버 올리고 레졸루션, 켈리브레이션,  로테이션 관련한 작업에 애를 좀 먹었다.
    ※ 이 글을 쓰게된 이유, 자료를 찾아서 이것 저것 시도해 보다가 바빠서 중단 했다가 다시 하게 되면 다 까먹고

        처음부터 자료를 찾아 보고 여기저기 커뮤니티 뒤지고 반복했던 것을 기록하여 정리 하고자 함

 

4. Amplifier Board : TPA3118D2 Class D 스테레오 2채널 파워 오디오 앰프 모듈 (https://www.devicemart.co.kr/goods/view?no=1386028)

   ※ 패시브 스피커 출력  : 4" Back Horn Speaker V2.0 :  https://www.thingiverse.com/thing:4750820

    유닛 : 삼미전자 4인치 풀레인지

 

5. VU Metter Board (https://ko.aliexpress.com/item/32838608263.html)

   ※ 음량을 아날로그 게이지로 보여주는 장치, 따뜻한 느낌의 주황색 조명이 래트로한 느낌을 주는 악세사리

       앰프가 동작 하는데 필수 요소는 아니지만... 유튜브에서 영상을 보고 이건 꼭 넣고 싶었다.

 

5. Power : 95W 3체널 SMPS (MORNSUN LM100-10C051515-30 : https://www.devicemart.co.kr/goods/view?no=12709762&srsltid=AfmBOorPsd_ypoOJLGOAa3jOfX7vuScJ64Ymg_dr1fmFS7rS-EeKf2Gz)

   ※ 라즈베리파이, 앰프, VU메터 보드 모두 유효 전압 범위가 제각각 이어서 3체널 저렴한 제품을 찾는데도 힘들었음

 

기타 여러가지 부품과 도구가 필요 하지만 굵직한 준미물은 이정도 였던 것 같다.

 

아직 뚜껑을 덮지는 못했지만 원하는 대로 동작을 하고 있음.

 

 

다음 편에서 볼루미오 설치 부터 Display 설정을 위해 했던 수많은 삽질을 정리해서 올려보겠습니다.

 

3.5인치 TFT LCD Display 설치 관련 내용은 2025년 2월 기준으로 정리해서 과거 작성했던 글을 업데이트 하였습니다.

https://opensrc.tistory.com/216

 

Raspberry Pi 3B+ 3.5" TFT LCD Tuch Display Install on Volumio

0. 시작하며과거 작성했던 내용이 정리가 잘 안돼있고 잘 못된 부분도 조금 있어서 2025년 2월 기준으로 새로 설치, 테스트 마치고 그 내용을 간단하게 정리해서 기존 글에 덮어 쓰게 되었습니다.

opensrc.tistory.com

 

많은 도움 되시길...

 

끝.

 

+ Recent posts