먼저 이론
service -e
=>현재 구동되고 있는 서비스 목록
sudo service myslq-server status
=> mqsql 상태
su
=> 바로 root로 접속
numberic(3,2)
=> 3자리 표현하면 소수점 2자리 표시
enum('wes','central','east');
<관리자 프로그램 , 유틸리티>
- ibd2sdi
- innochecksums
- myisam_ftpdump
- myisamchk
- myisamlog
- mysampack
- myslql_config_editor
- mysqlbinlog
- myusqldumpslow
● 프로그램 개발 유틸리티
- mysql_config
- my_print_defautlts
- resolve_statck_dump
- Iz4_decompress
- perror
- resloveip
- zlib_decompress
<>
● 오픈소스 데이터베이스 엔진
● 데이터를 디스크에 어떠한 형태로 기록, 관리할 것인가를 결정
● MyISAM : 구형 엔진, 읽기 위주 데이터 저장에 적합
● 새로운 버전, MyISAM을 대체해 나가는 중
<Mysql - 사용자 계정관리>
● 데이터 베이스는 별도의 사용자 데이터 베이스를 구축
● 시스템 사용자와는 다른 사용자 세트를 사용
● select current_user(); -- 현재 사용중인 계정명 반환
<사용자 계정의 표시>
● 'user_name'@'host_name'
● user_name은 최대 32개 문자까지 가능
● 여러 호스트/도메인에 돔영 이인이 있을 수 있으므로
메일 주소와 비슷한 형식을 사용자
- 'alice'@'192.168.0.10'
- 'alice'@'%.my_domian.com'
- 'bob'@'localhost'
● 도메인과 호스트 이름
● www.naver.com에서
- www는 특정 서버 컴퓨터를 뜻하는 호스트의 이름
- naver.com은 도메인 이름을 뜻함
- .com은 최상위 도메인(Top Level domain)이라 부름
● 일반적으로 호스트명(hostname) www만을 지칭하나
명확한 호스트명을 표시하기 위해 모든 파트를 다 언급하기도 함
● www.naver.com 과 같이 모든 파트를 다 언급하는 형태를
FQFN(Fully qualified domain Name)이라고 하고
● 특히 DNS 시스템을 구성할 때에는 www.naver.com.과 같이
마지막에 .을 표기하도록 하는 경우도 있음
● 사용자 명은 특정 사용자 이름 외 빈칸을 입력할 수 있음
● 사용자 명에는 패턴 매칭 사용 불가
● 빈칸은 모든 사용자 명을 뜻함
- ''@'192.168.0.10'
- ''@'%.mydomain.com'
● 호스트/도메인을 명을 입력하지 않으면 '%'로 처리
- 'alice'
- 'alice'@'%'
● 괄호에 주의
- 'alice@localhost'
=> 사용자 이름으로 인식
'alice'@'localhost;로 사용하여야 한다.
- 'alice@localhost'@'%'
● 호스트/ 도메인 명에 Like 구문에서와 가트은 패턴매칭 사용가능
- 'alice'@'192.168.100.%'
- 'bob'@'%.com'
● IPv4 주소를 사용할 경우 마스크 값 사용가능
- 'alice'@'192.168.100.0/255.255.255.0'
● h1.example.net에서 접속하는 fred
=>'fred'@'h1.example.net'
● h1.example.net에서 접속하는 모든 사용자명
=> ''@'h1.example.net'
● 불특정한 호스트(모든 호스트)에서 접속하는 fred
=>'fred'@'%'
● 불특정한 호스트(모든 호스트)에서 접속하는 모든 사용자명
=> "@'%'
● example.net 도메인의 모든 호스트에서 접속하는 fred
=> 'fred'@'%.example.net'
● 192.51.100.0/24 네트워크에서 접속하는 fred
=>'fred'@'192.51.100.0/255.255.255.0'
<사용자 인증>
● 호스트명, 사용자명, 패스워드 검증
● 검증시 사용자 테이블을 정렬하여 최초 매칭되는 경우를 사용
1. 호스트가 가장 구체적으로 명시되어 있는 순서대로 정렬
2. 사용자명이 가장 구체적으로 명시되어 있는 순서대로 정렬
3. 호스트와 사용자 명의 구체성이 동일한 경우, 정렬순서는 랜덤
● 구체적인 명시
- 'h1.example.net'이 '%.example.net'보다 더 구체적임
- 'alice' 보다 더 구체적임
<사용자 작업권한 인증>
● 접속이후 사용자가 입력하는 명령어 사용권한을 인증함
● mysql 데이터 베이스의 user테이블에 기록되는 권한은
모든 데이터 베이스에 대한 사용자 계정의 권한을 표시
● 관리자 계정 외에는 myslq.user테이블에 기록되는 권한은 'N'으로,
mysql.db 테이블을 사용하여 각 데이터베이스, 테이블, 칼럼 별 권한을
지정하여 사용하는 것이 안전
<사용자 작업권한 적용 시기>
● 서버 시작시 권한 사항을 메모리에 저장하여 구동되고
● gran, revoke등 DCL을 사용한 구너한 조정은 실시간 권한 적용
● insert, update 등 DML을 이용하여 직접 테이블 값을 수정한 겂은
- FLUSH PRIVILEGES;
- msysqladmin flush-privileges
- mysqladmin reload
명령어 이후 적용
● 명령어 권한은 다음번 명령어 사용시 적용시작
● 데이터베이스 권한은 다음번 use db_name; 구문 사용시 적용
<사용자 계정의 추가 /삭제>
● CREATE USER user_nema IDENTIFIED BY password;
● user_name 은 올바른 사용자계정 이름의 형식을
● password는''를 사용한 문자열
● DROP USER user_name;
select user,host from mysql.user;
=> 사용자 조회
<사용자 계정: 리소스 권한>
s
● 시간당 SQL문 사용 가능 횟수
=> WITH MAX_QUERIES_PER_HOUR
● 시간당 update 명령어 사용 가능 횟수
=> WITH MAX_UPADATES_PER_HOUR
● 시간당 접속 가능 횟수
=> WITH MAX_CONNECTIONS_PER_HOUR
● 가능한 동시접속 횟수
=> WITH MAX_USERS_CONNNECTIONS
<사용자 계정 : 패스워드 관리 >
/usr/local/etc/mysql
● 패스워드 변경
- ALTER USER user_name IDENTIFIED BY password;
- SET password for user_name = password;
● 패스워드 만료 설정
- ALTER USER user_name PASSWORD EXPIRE
- ALTER USER user_name PASSWORD EXPIRE INTERVAL 90 DAY;
- my.cnf mysqlid 섹션 : default_passwordk_lifetime
0는 제한없음, 기타 숫자는 패스워드의 기본 유효기간
● 패스워드 재사용
- my.conf의 mysql 섹션 : password_history
password_reuse_interval
● 패스워드 재사용 전 5번의 다른 패스워드 사용을 강제
- ALTER USER user_name PASSWORD HISTORY 5;
● 패스워드 재상용 전 6일이 지나도록 강제
- ALTER USER user_name PASSWORD REUSE INTERVAL 6 DAY;
● 패스워드가 만료된 계정으로 접속이후
mysql --connect-expired-password 사용
<사용자 계정 잠금>
● ALTER USER user_name ACCOUNT LOCK
● ALTER USER user_name ACCOUNT UNLOCK
<사용자 계정 보안 접속방법 제한>
● ALTER USER user_name REQUIRE NONE;
● ALTER USER user_name REQUIRE SSL;
● ALTER USER user_name REQUIRE X509;
● ALTER USER user_name REQUIRE ISSUER;
● ALTER USER user_name REQUIRE SSL;
'/C=SE/ST=Stcoholm/L=stockholm/O=MySQL/CN=CA/
emailAddress=ca@example.com
<사용자 계정 실습>
● vic.esample.net에서 접속하는 vitcor계정을 생성하면서
'my_pass'를 패스워드로 지정
=> create user victro'@'vic.example.net identifed by 'my_pass';
● t5.example.net에서 접속하는 trent계정을 생성하면서
SSL 암호화된 접속만을 허용하고 동시 접속 가능 회선을 3개로 제한
=> create user trent'@'t5.example.net' identifed by 'password' REQUIRE
SSL with MAX_USER_CONNECTION 3;
<Grant, Revoke>
● 계정에 대한 현재 GRANT 내역 조회
● 사용가능한 SQL문의 제한없음
ALL
SELECT
UPDATE
INSERT
CREATE
DROP
ALTER
...
● 레벨: 전체, 테이블, 칼럼
● 레벨의 표시
*
*.*
db_name.*
db_name.table_name
<사용자 계정 SQL >
● GRANT _ 허용 SQL_ON_ 레벨_TO user_name;
● GRANT SELECT ON test.*TO 'eve'@'localhost';
● GRANT SELECT(col1). INSERT(col1, col2) ON test.tb1 TO 'may'@'localhost';
● REVOKE는 GRANT와 같은 형태의 문법 사용
● FLUSH PRIVILEGES
=> 권한 다시 재로드.(초기화)
root에서 권한
grant all on world.* to 'tuser1'@'localhost';
tuser1으로 로그인
=> show databases;
● 192.168.0.0/24 네트워크 대에서 접속하는 trent계정
=> create user 'trent'@'192.168.0.0/255.255.255.0' identfied by 'pass';
● trent는 test 데이터베이스의 t1 테이블에 데이터 추가 가능
=> grant insert on test.t1 to 'trent'@'192.198.0.0/255.255.255.0';
● trent는 test 데이터베이스의 모든 테이블 값을 제한없이 조회가능
=> grant all on test.* to 'trent'@'192.168.0.0/255.255.255.0';
● trent는 test 데이터베이스의 t2 테이블의 c1 칼럼의 값을 변경 가능
=> grant update(c1) on test.t2 to 'trent'@'192.168.0.0/255.255.255.0';
칼럼은 ()쳐서 칼럼을 적는다.
//////////////////////////////////////////////////////////////////////////////
service -e
=>현재 구동되고 있는 서비스 목록
sudo service myslq-server status
=> mqsql 상태

아래 명령어도 mysql -uroop -p와 같은 명령어이다. 길게 사용할 때는 '--'를 두번 붙인다.

그냥 pager라고 하면 more인식되나, pager less라고 입력시 less처럼 사용할 수 있다.

● select current_user(); -- 현재 사용중인 계정명 반환

mysql데이터베이스에 user라는 테이블에서 계정을 관리하고 생성, 삭제가 이루어진다. 따라서 계정을 조회하기 위해서는
mysql.user에서 조회 가능하다.

계정을 삭제하는 모습

계정을 생성이 가능하다. 생성된 계정을 한 번 더 만들려고 하면 에러가 발생한다. 그러나 syntax를 참고하여 if not exist를 적어두면
에러를 내지 않는다. 왜냐하면 적어도 되고, 안적어도 된다라고 알려주므로 PC가 있으면 생성하지 않고, 없으면 생성한다고 알아먹기
때문이다.

<사용자 작업권한 인증>
● 접속이후 사용자가 입력하는 명령어 사용권한을 인증함
● mysql 데이터 베이스의 user테이블에 기록되는 권한은
모든 데이터 베이스에 대한 사용자 계정의 권한을 표시
● 관리자 계정 외에는 myslq.user테이블에 기록되는 권한은 'N'으로,
mysql.db 테이블을 사용하여 각 데이터베이스, 테이블, 칼럼 별 권한을
지정하여 사용하는 것이 안전
<사용자 작업권한 적용 시기>
● 서버 시작시 권한 사항을 메모리에 저장하여 구동되고
● gran, revoke등 DCL을 사용한 구너한 조정은 실시간 권한 적용
● insert, update 등 DML을 이용하여 직접 테이블 값을 수정한 겂은
- FLUSH PRIVILEGES;
- msysqladmin flush-privileges
- mysqladmin reload
명령어 이후 적용
● 명령어 권한은 다음번 명령어 사용시 적용시작
● 데이터베이스 권한은 다음번 use db_name; 구문 사용시 적용
<사용자 계정의 추가 /삭제>
● CREATE USER user_nema IDENTIFIED BY password;
● user_name 은 올바른 사용자계정 이름의 형식을
● password는''를 사용한 문자열
● DROP USER user_name;
select user,host from mysql.user;
=> 사용자 조회
<사용자 계정: 리소스 권한>
● 시간당 SQL문 사용 가능 횟수
=> WITH MAX_QUERIES_PER_HOUR
● 시간당 update 명령어 사용 가능 횟수
=> WITH MAX_UPADATES_PER_HOUR
● 시간당 접속 가능 횟수
=> WITH MAX_CONNECTIONS_PER_HOUR
● 가능한 동시접속 횟수
=> WITH MAX_USERS_CONNNECTIONS
<사용자 계정 : 패스워드 관리 >
/usr/local/etc/mysql
● 패스워드 변경
- ALTER USER user_name IDENTIFIED BY password;
- SET password for user_name = password;
● 패스워드 만료 설정
- ALTER USER user_name PASSWORD EXPIRE
- ALTER USER user_name PASSWORD EXPIRE INTERVAL 90 DAY;
- my.cnf mysqlid 섹션 : default_passwordk_lifetime
0는 제한없음, 기타 숫자는 패스워드의 기본 유효기간
● 패스워드 재사용
- my.conf의 mysql 섹션 : password_history
password_reuse_interval
● 패스워드 재사용 전 5번의 다른 패스워드 사용을 강제
- ALTER USER user_name PASSWORD HISTORY 5;
● 패스워드 재상용 전 6일이 지나도록 강제
- ALTER USER user_name PASSWORD REUSE INTERVAL 6 DAY;
● 패스워드가 만료된 계정으로 접속이후
mysql --connect-expired-password 사용
<사용자 계정 잠금>
● ALTER USER user_name ACCOUNT LOCK
● ALTER USER user_name ACCOUNT UNLOCK
<사용자 계정 보안 접속방법 제한>
● ALTER USER user_name REQUIRE NONE;
● ALTER USER user_name REQUIRE SSL;
● ALTER USER user_name REQUIRE X509;
● ALTER USER user_name REQUIRE ISSUER;
● ALTER USER user_name REQUIRE SSL;
'/C=SE/ST=Stcoholm/L=stockholm/O=MySQL/CN=CA/
emailAddress=ca@example.com
● t5.example.net에서 접속하는 trent계정을 생성하면서
SSL 암호화된 접속만을 허용하고 동시 접속 가능 회선을 3개로 제한
=> create user trent'@'t5.example.net' identifed by 'password' REQUIRE
SSL with MAX_USER_CONNECTION 3;
이 부분은 syntax를 참고해야 한다. syntax는 나중에 포스팅 예정

<사용자 계정 SQL >
● GRANT _ 허용 SQL_ON_ 레벨_TO user_name;
● GRANT SELECT ON test.*TO 'eve'@'localhost';
● GRANT SELECT(col1). INSERT(col1, col2) ON test.tb1 TO 'may'@'localhost';
● REVOKE는 GRANT와 같은 형태의 문법 사용
● FLUSH PRIVILEGES
=> 권한 다시 재로드.(초기화)
<실습>
create user 'tuser'@'localhost' (identified by '패스워드'); 명령어로 임의의 계정을 생성.
root 계정에서 먼저 권한을 준다.
=>grant all on world.* to 'tuser1'@'localhost';
tuser1으로 로그인
=> show databases;
