일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- JWT
- sql injection
- 웹개발
- blind sql injection
- sql injection point
- 모의해킹
- CTF
- MySQL
- Reflected Xss
- cors
- lord of sqli
- union sql injection
- XSS
- 쿠키
- css
- Cross Site Request Forgery
- 게시판 만들기
- file upload
- 과제
- Los
- 로그인페이지
- csrf
- Error based sql injection
- Python
- 로그인
- 세션
- lord of sql injection
- JS
- php
- cookie 탈취
- Today
- Total
Almon Dev
모의해킹 공부 정리 4,5,6 일차 (mysql 설정) 본문
고민
사실 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주차 강의도 기대되네요
'모의해킹 > 웹 개발' 카테고리의 다른 글
모의해킹 공부 정리 8일차 (과제) (1) | 2024.10.24 |
---|---|
모의해킹 공부 정리 7일차 (mysql 적용) (0) | 2024.10.23 |
모의해킹 공부 정리 3일차 (회원가입 페이지) (0) | 2024.10.19 |
모의해킹 공부 정리 2일차 (과제) (2) | 2024.10.18 |
모의해킹 공부 정리 2일차 (과제) (5) | 2024.10.18 |