서버구축 (WEB,DB)

MySQL/PostgreSQL 통신 프로토콜 암호화 SSL/TLS 인증서 구성

날으는물고기 2024. 9. 3. 00:46

MariaDB/MySQL의 네트워크 통신을 암호화하여 보안을 강화하는 방법입니다. MariaDB/MySQL은 SSL/TLS를 통해 데이터 전송을 암호화할 수 있습니다. 아래 단계에 따라 SSL/TLS 설정을 구성할 수 있습니다.

1. SSL 인증서 생성

SSL 인증서를 생성해야 합니다. OpenSSL을 사용하여 자체 서명된 인증서를 생성할 수 있습니다.

1.1 CA 인증서 및 키 생성

openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3650 -key ca-key.pem -out ca-cert.pem

1.2 서버 인증서 및 키 생성

openssl req -newkey rsa:2048 -days 3650 -nodes -keyout server-key.pem -out server-req.pem
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -req -in server-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem

1.3 클라이언트 인증서 및 키 생성

openssl req -newkey rsa:2048 -days 3650 -nodes -keyout client-key.pem -out client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -req -in client-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem

2. MySQL 서버 설정

MySQL 서버에서 SSL을 사용하도록 설정합니다.

2.1 MySQL 설정 파일 수정

MySQL 설정 파일(my.cnf 또는 my.ini)을 열고 아래와 같이 SSL 관련 설정을 추가합니다.

[mysqld]
ssl-ca=/path/to/ca-cert.pem
ssl-cert=/path/to/server-cert.pem
ssl-key=/path/to/server-key.pem

2.2 MySQL 서버 재시작

MySQL 서버를 재시작하여 변경 사항을 적용합니다.

systemctl restart mysql

3. MySQL 클라이언트 설정

MySQL 클라이언트에서도 SSL을 사용하도록 설정해야 합니다.

3.1 클라이언트 설정 파일 수정

클라이언트 설정 파일(~/.my.cnf 또는 별도의 설정 파일)을 열고 아래와 같이 SSL 관련 설정을 추가합니다.

[client]
ssl-ca=/path/to/ca-cert.pem
ssl-cert=/path/to/client-cert.pem
ssl-key=/path/to/client-key.pem

3.2 MySQL 클라이언트 접속

MySQL 클라이언트가 SSL을 사용하여 서버에 접속하도록 합니다.

mysql --ssl-ca=/path/to/ca-cert.pem --ssl-cert=/path/to/client-cert.pem --ssl-key=/path/to/client-key.pem -u 사용자명 -p

4. SSL 설정 확인

MySQL에 접속하여 SSL 설정이 제대로 적용되었는지 확인합니다.

SHOW VARIABLES LIKE '%ssl%';

have_ssl 변수 값이 YES로 설정되어 있어야 하며, 다른 SSL 관련 변수들도 올바르게 설정되어 있는지 확인합니다.

위 단계들을 따라 MySQL 서버와 클라이언트 간의 통신을 암호화할 수 있습니다. 이로 인해 네트워크를 통해 전송되는 데이터가 보호되며, 보안 수준이 크게 향상됩니다.

PostgreSQL에서도 SSL/TLS를 사용하여 네트워크 통신을 암호화할 수 있습니다.

1. SSL 인증서 생성

먼저, SSL 인증서를 생성해야 합니다. OpenSSL을 사용하여 자체 서명된 인증서를 생성할 수 있습니다.

1.1 CA 인증서 및 키 생성

openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.crt

1.2 서버 인증서 및 키 생성

openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
openssl x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256

1.3 클라이언트 인증서 및 키 생성

openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr
openssl x509 -req -in client.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out client.crt -days 500 -sha256

2. PostgreSQL 서버 설정

PostgreSQL 서버에서 SSL을 사용하도록 설정합니다.

2.1 인증서 파일 복사

생성한 인증서와 키 파일을 PostgreSQL 데이터 디렉터리로 복사합니다. PostgreSQL 데이터 디렉터리는 일반적으로 /var/lib/pgsql/{version}/data 또는 /var/lib/postgresql/{version}/main에 위치합니다.

cp server.crt server.key rootCA.crt /var/lib/postgresql/{version}/main/
chown postgres:postgres /var/lib/postgresql/{version}/main/server.crt /var/lib/postgresql/{version}/main/server.key /var/lib/postgresql/{version}/main/rootCA.crt
chmod 600 /var/lib/postgresql/{version}/main/server.key

2.2 PostgreSQL 설정 파일 수정

PostgreSQL 설정 파일(postgresql.conf)을 열고 아래와 같이 SSL 관련 설정을 추가합니다.

ssl = on
ssl_cert_file = '/var/lib/postgresql/{version}/main/server.crt'
ssl_key_file = '/var/lib/postgresql/{version}/main/server.key'
ssl_ca_file = '/var/lib/postgresql/{version}/main/rootCA.crt'

또한, 클라이언트 인증서를 요구하려면 pg_hba.conf 파일을 수정하여 SSL 접속을 허용합니다.

hostssl all all 0.0.0.0/0 cert

2.3 PostgreSQL 서버 재시작

PostgreSQL 서버를 재시작하여 변경 사항을 적용합니다.

systemctl restart postgresql

3. PostgreSQL 클라이언트 설정

PostgreSQL 클라이언트에서도 SSL을 사용하여 서버에 접속할 수 있도록 설정해야 합니다.

3.1 클라이언트 설정

클라이언트 인증서와 키 파일을 적절한 위치에 저장합니다.

cp client.crt client.key rootCA.crt ~/.postgresql/
chmod 600 ~/.postgresql/client.key

3.2 PostgreSQL 클라이언트 접속

PostgreSQL 클라이언트가 SSL을 사용하여 서버에 접속하도록 합니다.

psql "host=서버주소 user=사용자명 dbname=데이터베이스명 sslmode=verify-ca sslrootcert=~/.postgresql/rootCA.crt sslcert=~/.postgresql/client.crt sslkey=~/.postgresql/client.key"

4. SSL 설정 확인

PostgreSQL에 접속하여 SSL 설정이 제대로 적용되었는지 확인합니다.

SHOW ssl;

ssl 변수 값이 on으로 설정되어 있어야 하며, 다른 SSL 관련 변수들도 올바르게 설정되어 있는지 확인합니다.

 

위 단계들을 따라 PostgreSQL 서버와 클라이언트 간의 통신을 암호화할 수 있습니다. 이를 통해 네트워크를 통해 전송되는 데이터가 보호되며, 보안 수준이 크게 향상됩니다.

MySQL과 PostgreSQL의 암호화 통신을 설정한 후, PHP와 Python에서 암호화된 연결을 설정하는 방법입니다.

MySQL의 PHP 및 Python 설정

1. PHP에서 MySQL 암호화 설정

PHP에서 MySQL에 SSL을 사용하여 연결하려면 mysqli 또는 PDO를 사용할 수 있습니다.

 

1.1 mysqli를 사용하는 경우

$mysqli = mysqli_init();
mysqli_ssl_set($mysqli, '/path/to/client-key.pem', '/path/to/client-cert.pem', '/path/to/ca-cert.pem', NULL, NULL);
mysqli_real_connect($mysqli, 'hostname', 'username', 'password', 'database');

if (mysqli_connect_errno()) {
    die('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error());
}

echo 'Connected to MySQL with SSL';

1.2 PDO를 사용하는 경우

$dsn = 'mysql:host=hostname;dbname=database;charset=utf8';
$options = [
    PDO::MYSQL_ATTR_SSL_KEY    => '/path/to/client-key.pem',
    PDO::MYSQL_ATTR_SSL_CERT   => '/path/to/client-cert.pem',
    PDO::MYSQL_ATTR_SSL_CA     => '/path/to/ca-cert.pem',
    PDO::ATTR_ERRMODE          => PDO::ERRMODE_EXCEPTION,
];

$pdo = new PDO($dsn, 'username', 'password', $options);
echo 'Connected to MySQL with SSL';

2. Python에서 MySQL 암호화 설정

Python에서 MySQL에 SSL을 사용하여 연결하려면 mysql-connector-python 또는 PyMySQL 라이브러리를 사용할 수 있습니다.

 

2.1 mysql-connector-python을 사용하는 경우

import mysql.connector

conn = mysql.connector.connect(
    host='hostname',
    user='username',
    password='password',
    database='database',
    ssl_ca='/path/to/ca-cert.pem',
    ssl_cert='/path/to/client-cert.pem',
    ssl_key='/path/to/client-key.pem'
)

print('Connected to MySQL with SSL')
conn.close()

2.2 PyMySQL을 사용하는 경우

import pymysql

conn = pymysql.connect(
    host='hostname',
    user='username',
    password='password',
    database='database',
    ssl={
        'ca': '/path/to/ca-cert.pem',
        'cert': '/path/to/client-cert.pem',
        'key': '/path/to/client-key.pem'
    }
)

print('Connected to MySQL with SSL')
conn.close()

PostgreSQL의 PHP 및 Python 설정

1. PHP에서 PostgreSQL 암호화 설정

PHP에서 PostgreSQL에 SSL을 사용하여 연결하려면 pg_connect 또는 PDO를 사용할 수 있습니다.

 

1.1 pg_connect를 사용하는 경우

$conn_string = "host=hostname dbname=database user=username password=password sslmode=require sslrootcert=/path/to/rootCA.crt sslcert=/path/to/client-cert.pem sslkey=/path/to/client-key.pem";
$dbconn = pg_connect($conn_string);

if (!$dbconn) {
    echo "An error occurred.\n";
    exit;
}

echo 'Connected to PostgreSQL with SSL';

1.2 PDO를 사용하는 경우

$dsn = 'pgsql:host=hostname;dbname=database';
$options = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES => false,
];

$pdo = new PDO($dsn, 'username', 'password', $options);
$pdo->exec("SET sslmode TO 'require'");
$pdo->exec("SET sslrootcert TO '/path/to/rootCA.crt'");
$pdo->exec("SET sslcert TO '/path/to/client-cert.pem'");
$pdo->exec("SET sslkey TO '/path/to/client-key.pem'");

echo 'Connected to PostgreSQL with SSL';

2. Python에서 PostgreSQL 암호화 설정

Python에서 PostgreSQL에 SSL을 사용하여 연결하려면 psycopg2 또는 SQLAlchemy 라이브러리를 사용할 수 있습니다.

 

2.1 psycopg2를 사용하는 경우

import psycopg2

conn = psycopg2.connect(
    dbname='database',
    user='username',
    password='password',
    host='hostname',
    sslmode='verify-full',
    sslrootcert='/path/to/rootCA.crt',
    sslcert='/path/to/client-cert.pem',
    sslkey='/path/to/client-key.pem'
)

print('Connected to PostgreSQL with SSL')
conn.close()

2.2 SQLAlchemy를 사용하는 경우

from sqlalchemy import create_engine

engine = create_engine('postgresql+psycopg2://username:password@hostname/database', connect_args={
    'sslmode': 'verify-full',
    'sslrootcert': '/path/to/rootCA.crt',
    'sslcert': '/path/to/client-cert.pem',
    'sslkey': '/path/to/client-key.pem'
})

connection = engine.connect()
print('Connected to PostgreSQL with SSL')
connection.close()

이와 같이, PHP와 Python에서 MySQL과 PostgreSQL에 대해 SSL/TLS 암호화 설정을 적용하여 안전한 통신을 구현할 수 있습니다. 각 언어와 데이터베이스에 맞는 라이브러리와 설정을 사용하여 암호화된 연결을 구성하면 보안이 크게 향상됩니다.

728x90