InfoSec / / 2024. 9. 27. 09:40

데이터베이스 보안 (2)

ufw 방화벽 사용하기

# ufw 사용하기

ufw enable

 

# ufw 상태 확인

ufw status verbose

 

 

방화벽을 사용하면 웹 서버 접속이 불가능해집니다.

 

 

특정 서비스만 접속 허용하기

사용할 포트만 방화벽을 열도록 설정해

특정 서비스만 접속하도록 설정할 수 있습니다.

 

# http 포트만 허용하기

ufw allow http

 

이제 다시 http 웹 서버에 접속이 가능합니다.

 

 

특정 네트워크 대역만 접속 허용하기

먼저 테스트를 위해 허용했던 http 정책을 삭제해 보겠습니다.

ufw delete allow http

 

ufw status verbose

 

이제 다시 웹 서버에 접속이 불가능 해졌습니다.

 

여기서 192.168.5.0/24 대역의 http 서버 접속을 허용하고 싶을 경우 다음과 같이 입력합니다.

ufw allow from 192.168.5.0/24 to any port http

 

ufw status verbose

 

 

이제 192.168.5.0~192.168.5.255 네트워크에서만 http 서버 접속이 가능합니다.

 

ufw GUI 버전 사용하기

# GUI ufw 설치

apt install gufw

 

# gufw 실행

gufw

 

CMD 에서 실행하는 것과 GUI로 실행하는 것 둘 다 같은 내용이므로

서로의 상태가 실시간으로 동일하게 반영됩니다.

 

편한 것을 사용하면 됩니다.

 

 

데이터베이스 사용자 권한 최소화하기

특정 IP대역, 특정 DB만 접속 가능한 계정 생성하기 

mySQL)

# 192.168.5.0/24 대역에서만 webhack DB에 로그인 가능한 user0 계정 만들기

grant all privileges on webhack.* to 'user0'@'192.168.5.%' identified by '123456';

 

# 계정이 잘 생성되었는지 확인

select user,host from mysql.user;

 

 

윈도우 CMD)

# 원격 접속이 잘 되는지 확인

mysql -u user0 -h [서버IP] -p

 

# 사용 가능한 데이터베이스 확인

show databases;

 

이런 식으로 특정 유저가 접속 가능한 IP대역과

접속 가능한 데이터베이스를 제안함으로써 데이터베이스의 기밀성을 높일 수 있습니다.

 

 

데이터베이스 이중화

서버가 DDoS 공격이나 해킹을 당해 장애가 발생할 경우를 대비하여

데이터베이스를 이중화 구성하거나 3대 이상의 서버로 구성되는

클러스터 기능을 활용하여 가용성을 유지하도록 합니다.

 

Master 서버 설정

# mySQL 환경설정

gedit /etc/mysql/my.cnf

 

# 마지막에 구문 추가

[mysqld]
server-id=1
log-basename=master
log-bin
binlog-format=row
binlog-do-db=replica_db

 

# Slave가 Master에 접속하기 위한 환경설정

gedit /etc/mysql/mariadb.conf.d/50-server.cnf

 

# 15라인부터 주석 해제 및 구문 추가

user                    = mysql
pid-file                = /run/mysqld/mysqld.pid
socket                  = /run/mysqld/mysqld.sock
basedir                 = /usr
datadir                 = /var/lib/mysql
tmpdir                  = /tmp
lc-messages-dir         = /usr/share/mysql

 

# 28라인 구문 수정

bind-address            = [MasterDB IP]

 

이후 데이터베이스 데몬을 재실행합니다.

 

# Slave 계정 생성 및 권한 부여

create database replica_db;

 

grant replication slave on *.* to 'slave'@'%' identified by 'orange';

 

flush privileges;

 

flush tables with read lock;

 

show master status;

정보를 확인한 후, slave에게 File명과 Position 번호를 알려줍시다.

 

그리고 동기화를 위해서 Master는 DB에서 로그아웃하고,

만일의 사태를 대비하여 DB를 백업해둡니다.

 

# 마스터 DB 백업

mysqldump -u root -p --all-databases --master-data > backup.sql

 

Master 서버 데이터베이스의 백업이 잘 된것을 확인하였습니다.

 

# Slave로 파일 전송

scp backup.sql root@[SLAVE IP]:/root/backup.sql

 

# DB 접속 후 테이블 잠금 풀기

mysql -u root -p

 

UNLOCK TABLES;

 

 

이제 Master Server는 설정이 완료되었습니다.

 

Slave 서버 설정

# 호스트 이름을 SLAVE로 설정

hostnamectl set-hostname SLAVE

 

# mysql 환경설정 파일 수정

gedit /etc/mysql/my.cnf

 

# 마지막에 구문 추가

[mysqld]
server-id=2
replicate-do-db=replica_db

 

# 백업파일을 데이터베이스에 삽입

mysql -u root -p < backup.sql

 

# replica_db가 잘 등록되었는지 확인

mysql -u root -p

show databases;

 

 

# 동기화 설정을 위해 SLAVE 서버 멈추기

STOP SLAVE;

 

# 마스터 서버 설정

CHANGE MASTER TO  MASTER_HOST='마스터IP', 
MASTER_USER='slave', 
MASTER_PASSWORD='orange', 
MASTER_LOG_FILE='mysqld-bin.XXXXXXXX', 
MASTER_LOG_POS=XXX;

 

# SLAVE 서버 다시 시작

START SLAVE;

 

# SLAVE 등록이 잘 되었는지 확인

SHOW SLAVE STATUS\G;

이제 SLAVE 서버 설정이 완료되었습니다.

 

MASTER의 replica_db에 변동사항이 생기면

SLAVE의 replica_db도 갱신됩니다.

Master 서버에서 user테이블을 추가하자 SLAVE에도 추가되었습니다.

 

 

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유