Almon Dev

모의해킹 공부 정리 4,5,6 일차 (mysql 설정) 본문

모의해킹/웹 개발

모의해킹 공부 정리 4,5,6 일차 (mysql 설정)

Almon 2024. 10. 22. 17:07

고민

사실 4,5일 차는 어떻게 해야 할지 고민하는 시간이었습니다.

글쓰기 기능을 추가하려고 보니 txt파일로 DB를 대체하는 것은
점점 복잡해지는 것 같습니다

폴더를 board --- ID --- Title 이런 식으로 구성하고,
글의 내용을 작성시간(수정시간):글내용 이런 식으로 저장해보려고 했으나
이제는 그냥 DB를 쓰는 게 더 나을 거 같다는 들어 Mysql을 사용해보고자 합니다.

 

우선 mysql의 비밀번호부터 설정합니다.

처음 mysql을 설치하고 나면 root의 비밀번호가 설정되어있지 않습니다.

이는 보안상 매우 취약하기도 하니 비밀번호를 설정해 줍니다.

 

sudo mysql_secure_installation

mysql설치 시 다운로드되는 mysql_secure_installation 스크립트를 실행합니다.

 

mysql_secure_installation을 실행하면 아래처럼 4개의 보안 설정이 나옵니다.

각 설정을 Y/N을 입력하여 선택하면 됩니다.

 

  • remove anonymous user? :  anonymous user(익명 유저)를 제거합니다. Y
  • Disallow root login remotely? : root 계정의 원격 접속을 금지합니다. Y
  • Remove test database and access to it? : 테스트 데이터베이스를 삭제합니다. Y
  • Reload privilege tables now? : 테이블 권한을 리로딩해서 설정을 바로 적용합니다. Y

저는 모두 Y를 해줬습니다.

그런데 root 비밀번호 설정이 없습니다.

해결방법을 알아보니 root 비밀번호를 수동으로 설정할 수 있다고 합니다.

sudo mysql -u root -p
alter user 'root'@'localhost' identified with mysql_native_password by 'adminPassword1234!';

 

그런데 비밀번호 정책이 너무 불편합니다.

비밀번호는 어려운 게 보안상 좋지만 매번 저 긴 비밀번호를 입력하는 것은 힘든 일입니다.

정책을 한번 바꿔봅시다.

SHOW VARIABLES LIKE 'validate_password%';

 

이런 식으로 현재의 비밀번호 정책을 확인할 수 있습니다.

SHOW : 정보를 조회할 때 쓰는 명령어입니다.

SHOW VARIABLES : mysql 서버의 시스템 변수를 조회합니다.
시스템 변수는 mysql의 환경 설정을 조정할 때 쓰입니다.

LIKE : sql의 조건문 같은 것으로 뒤에 붙은 문자와 일치하는 패턴의 문자를 검색합니다.

'validate_password%' : validate_password로 이름이 시작되는 모든 함수를 의미합니다.

% : LIKE문에서 사용되는 와일드카드 문자로 뒤에 뭐가 있어도 상관없다는 의미로 해석할 수 있습니다.
EX) 리눅스에서 자주 사용되는 *과 비슷한 느낌

 

SET GLOBAL validate_password.policy = LOW; 
SET GLOBAL validate_password.mixed_case_count = 0;
SET GLOBAL validate_password.number_count = 0;
SET GLOBAL validate_password.special_char_count = 0;

 

SET : 변수의 값을 수정하거나 대입할 때 사용됩니다.

GLOBAL : 전역 변수를 의미합니다. mysql 서버의 모든 클라이언트에 적용되는 변수입니다.

validate_password.policy : 비밀번호 정책을 의미합니다. LOW, MEDIUM, HIGH가 있습니다.

validate_password.mixed_case_count : 대문자와 소문자를 같이 써야 하는 개수

validate_password.number_count : 숫자의 개수

validate_password.special_char_count : 특수문자의 개수

 

alter user 'root'@'localhost' identified with mysql_native_password by 'admin1234';

비밀번호를 admin1234로 바꿔줍니다.

재접속을 해서 확인하니 잘 적용됐습니다.

그런데 mysql 서비스를 재시작을 하면 설정이 초기화됩니다.

 

이는 설정파일을 수정하지 않고 global변수로 수정했기 때문에

재시작 시 다시 초기설정으로 돌아오기 때문입니다.

이미 변경된 비밀번호는 그대로이지만 그래도 다시 바꿀 수도 있으니 영구적으로 변경하고 싶습니다.

영구적으로 적용하기 위해서는 설정파일을 수정해야 합니다

/etc/mysql/my.cnf

mysql 설정파일은 /etc/mysql/my.cnf입니다.

그런데 설정 파일에 들어가면

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

이 두 가지밖에 없었습니다.

!includedir 는 이름 그대로 경로의 디렉터리를 포함하라는 뜻입니다.

설정파일을 /etc/mysql/conf.d 경로에 확장자를 .cnf를 붙여서 파일을 만들면
my.cnf에 포함되게 됩니다.

 

conf.d 디렉터리에 이미 mysql.cnf 파일이 있지만 해당 설정 파일은 내버려 두고

비밀번호 변수에 관한 설정은 validate_password.cnf 파일을 만들어서 관리하기로 했습니다.

 

sudo 권한으로 validate_password.cnf를 생성하고

[mysqld]
validate_password.policy=LOW
validate_password.length=8
validate_password.mixed_case_count=0
validate_password.number_count=0
validate_password.special_char_count=0

내용을 입력한 뒤 저장합니다.

sudo systemctl restart mysql

mysql 서비스를 재시작하고 설정파일이 적용됐는지 확인합니다.

sudo systemctl restart mysql
sudo mysql -u root -p
비밀번호 입력

show variables like 'validate_password%';


데이터베이스와 테이블 생성

이제 Almond 페이지에서 사용할 DB와 Table을 생성하겠습니다.

create database almond;
use almond;

create table users(
    id varchar(15) primary key,
    nickname varchar(20) unique not null,
    email varchar(50) unique not null,
    password varchar(200) not null
);

create database : database를 생성하는 구문입니다.

use almond : almond db를 사용한다는 의미입니다. use를 해야 해당 db의 테이블에 접근할 수 있습니다.

create table : table을 생성하는 구문입니다.

varchar() : mysql의 문자열을 의미하는 타입입니다. () 안에 넣은 숫자는 최대 길이를 의미합니다.

unique : 해당 필드에 추가되는 값은 중복이 불가능합니다.

not null : null(비워두는 것)이 불가능합니다. 

primary key : primay key(PK)는 기본적으로 unique와 not null이 설정되어 있습니다.
primary 키는 index를 자동으로 생성해서 해당 키의 열을 검색하면 검색 속도가 빨라집니다.

PK와 foreign key(FK)를 이용해서 테이블 간에 관계를 만들 수 있습니다.

 

create table test_users( 
    id int primary key, 
    name varchar(10)
);

create table test_password(
    id int primary key,
    password varchar(255) not null,
    foreign key(id) references test_users(id) ON DELETE Cascade
);

 

foreign key(id) references test_users(id) : FK를 생성합니다.

test_password(자식)와 test_users(부모)을 id라는 필드를 기준으로 관계를 생성합니다.

fk에 ON DELETE or On Update Cascade 같은 옵션을 추가하여
부모테이블의 데이터가 삭제될 때 자식테이블도 같이 삭제(수정)하도록 할 수 있습니다.

desc(Describe) : 테이블의 구조를 보여줍니다.

 

정리

음 그런데 만들고 보니 부족한 부분이 많이 보입니다.
생각이 많아서인지 정리가 잘 되지 않습니다.

내일은 db에 전화번호, 가입날짜, 수정날짜, 로그인날짜, 이름 같은 필드를 추가한 뒤에
웹사이트의 users.txt파일을 대신해 almond db를 연결해야겠습니다.

내일부터 열릴 2주차 강의도 기대되네요