Server

MYSQL 외부접근 허용하기

LimeLee 2019. 4. 11. 13:22

 

워게임 문제로 공부하다보면 자신의 서버로 무언가 요청을 한다던지 db로 원격접속을 시도해야한다던지 그런 유형들의 문제가 있다.

동아리실에서 문제를 풀 때는 네트워크 장비에 의해 요청이 하나같이 차단당해서 외부에 있는 서버가 간절했다.

포트포워딩이 가능하거나 공인아이피를 할당받은 서버가 있다면 mysql 원격접속할 수 있는 계정을 하나 만들어보자.

포트포워딩의 경우 mysql 원격접속 포트 3306(디폴트가 3306. 설정을 건드렸다면 수정한 포트 번호)포트와 외부에서 사용할 포트를 연결 해두자.

 

-

 

 

 

먼저 원격접속을 허용하도록 mysql설정파일을 수정한다.

/etc/mysql/mysql.conf.d/mysqld.cnf 파일에서 

bind-address = 127.0.0.1을 주석처리하고

bind-address = 0.0.0.0을 추가한다.

 

사용하는 mysql 버전 등에 따라 /etc/mysql/my.cnf에 있을수도 있다.    

이후 mysql 서비스를 재시작한다.

 

service mysql restart

 

재시작에 성공했다면 mysql에 접근한다.

 

 

create database [db명];

쿼리을 통해 사용할 db를 생성한다. 

 

 

select host,user from mysql.user;

접속 중인 db에서 사용중인 계정을 본다.

host가 전부 localhost로 되어있어 외부접속이 안되는 계정들이다. 

외부에서 접근 할 수 있는 계정을 하나 만들어두도록하자.

 

root로 만들어도 좋지만, 해당 mysql에 다른 서비스와 연동시켜서 사용하고 있는 게 있다면 

보안상 권한이 제한된 워게임용 외부접속 계정을 만들어봐도 좋다. 

 

 

insert into mysql.user (host,user,authentication_string,ssl_cipher, x509_issuer, x509_subject) values ('%','[user명]', password('[password 명]'),'','','');

쿼리를 통해 계정을 하나 생성한다. host의 %는 *애스터리스크와 같은 의미이다.

mysql 버전별로 계정을 생성하는 쿼리가 다르다. 5.7이상으로 password 컬럼의 이름이 authentication_string으로 바뀐다거나, ssl_cipher의 디폴트가 없어서 insert에 선언을 해줘야한다거나 하니 이 부분은 본인 mysql 버전에 맞는 쿼리를 사용하자.

 

 

계정을 만들어줬다면 SHOW GRANTS FOR 'user명'@'%'; 를 통해 권한을 확인 할 수 있다. 

만약 mysql.user에는 계정이 올라와있는데 에러가 뜬다면 FLUSH PRIVILEGES; 쿼리 후에 다시 확인해보자.

권한이 아무것도 없는 것을 확인하면 이제 권한을 주도록하자.

 

 

GRANT ALL PRIVILEGES ON *.* TO 'user명'@'%';

은 'user명'@'%'에게 *.*(모든 db, 모든 table)에 ALL PRIVILEGES(모든 권한)을 부여하는 쿼리다. 

권한은 https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html 여기서 확인 가능하다.

권한은 버전별로 다를수 있다.

 

그림에서는 grant select, insert on limedb.* to 'limelee'@'%'; 쿼리를 통해

limedb의 모든 table에 select, insert 권한만 허용했다.

 

권한이 추가된것을 확인한 후에 FLUSH PRIVILEGES; 를 통해 권한을 적용한다.

 

 

이제 권한이 잘 적용되었는지 확인하기 위해 추가한 계정으로 접속한 뒤 databases를 열람해본다.

열람권한은 limedb만 허용했으므로 limedb만 보이는 것을 확인 할 수 있다.

 

 

create 권한이 없으므로 table을 생성할 수 없다.

 

 

그 외에도 file 권한이 없어 load_file, into outfile등의 명령어도 사용할 수 없다.

 

 

db 외부 접속하는 문제도 잘 풀린다.