이번 실습도 이어서 해 보겠습니다. 유저를 추가하고, 해당 데이터베이스의 모든 권한을 새로 생성한 유저에게 주기만 하면 됩니다.


 먼저, 모든 location에서 접속이 가능한 test 계정을 생성해 보겠습니다. mysql에서는 caching_sha2_password로 인증을 하게 하겠습니다.

 

 추가를 하고 난 후에, mysql.user에서 User 필드만 보면, test가 추가되었다는 것을 알 수 있습니다.

 

 

 mysql.user에서 User가 'test'인 것만 뽑아보겠습니다.

 

 

 그러면 죄다 'N'이 찍힌 것을 알 수 있습니다. test로 데이터베이스를 생성하는 것도 못 하겠네요. 특정 유저에게 읽을 권한, 쓸 권한 등을 주는 것은 꽤 위험 부담이 따릅니다. 누군가 내가 만든 데이터베이스를 날려버릴 수도 있다면 어떨까요? 아니면, 민감한 시스템 정보들을 누군가 볼 수 있다면 어떨까요?

 

 

  간단하게 test2의 select_priv를 'Y'로 바꿔보겠습니다.

 

 update set where 문을 이용하면 쉽게 바꿀 수 있습니다. flush privileges 쿼리를 날리신 다음에, test2 유저로 재접속을 해 보겠습니다. 재접속을 했을 때, mysql.user에 있는 내용들 중에서 User와 Host만 추려서 출력해 보겠습니다.

 

 

 User와 Host가 잘 나옵니다.

 

 

 반면에, priv에 대한 설정을 모두 'N'으로 한 'test'@'localhost'의 경우에는 거부 당하는데요. 그 이유는 select command를 수행할 수 있는 권한이 없기 때문입니다. 유저에게는 필요한 권한만 주는 것이 맞으니, priv는 모두 'N'으로 설정을 해 놓고, 해당 유저가 소유한 데이터 베이스에 대한 권한만 부여하는 것이 좋아 보입니다. 필요 없는 권한을 과감하게 허용 하지 않는 것은 좋은 전략입니다.

 

 

 testU라는 데이터베이스를 추가하겠습니다. create database testU 쿼리를 입력하면, testU라는 데이터베이스가 하나 생성됩니다. 생성을 하고 나서 flush privileges를 적용해 보겠습니다.

 

 

 그리고 test 유저로 접속을 해서 use testU 쿼리를 수행하시면, Access denied가 됨을 알 수 있습니다.

 

 

 show grant for ~ 쿼리로, 해당 유저가 어떠한 권한을 가지고 있는지 보도록 하겠습니다. 'test'@'%'는 제가 생성한 유저입니다. 이 유저는 testU에 대한 어떠한 권한도 가지고 있지 않은 걸로 보입니다. 그렇기 때문에, testU에 접근하는 것, 심지어 testU안에 테이블을 생성하고, 삭제하고, 레코드를 insert하고, delete하고, select 하고, update 하는 일련의 작업들이 모두 거부가 됩니다.

 

 저는 'cho'@'%' 유저에, mydb 데이터베이스에 대한 권한들을 주었는데요. 'cho'@'%'의 권한을 출력해 보겠습니다.

 

 

 grant all privileges on mydb.* to 'cho'@'%'. 즉, mydb에 대한 권한 모두를 'cho'@'%'에 주었다는 의미입니다. 그러면 이것을 그대로 따라해 봅시다. 저는 test 유저에게 무엇을 줘야 하나요? 모든 권한을 줘야 합니다. 어떤 데이터베이스에 대해서? mydb가 아니라, testU에 대해서.

 

 grant all privileges on testU.* to 'test'@'%'은, testU 데이터베이스 내에서, 모든 권한을 'test'@'%'에게 주겠다는 의미입니다. 당연하게도, root를 잘 관리해야 하는 이유는, 사용할 수 있는 (허가된) 작업이 매우 많기 때문입니다. 그만큼 책임이 따른다고 생각하시면 편하겠습니다.

 


 이제 test가 testU 데이터베이스에 테이블을 생성하고, 그 테이블에 CRUD 연산이 잘 적용이 되는지 확인을 해 봐야겠습니다. 로컬에서, testU 데이터베이스가 있는 서버로 접속을 해 보았습니다. 서버에 접속을 해서, testU 데이터 베이스를 사용하겠습니다.

 

 

 테이블을 생성하는 쿼리입니다.

 

 

 그리고, 이것은 테이블에 1과 2를 넣는 쿼리입니다. select문으로 전체 데이터를 조회해 보겠습니다.

 

 

 그러면 1과 2가 잘 들어가 있는 것을 볼 수 있습니다.

 

 

 이제 id가 1인 필드만 삭제하고 다시 조회해 보겠습니다.

 

 

 그러면 2만 나온다는 것을 알 수 있습니다. test 유저로 testU 데이터베이스로 접속해서, CRUD 연산까지 잘 되는 것을 확인하였습니다. 이번 시간에는 데이터베이스의 모든 권한을 줘서 CRUD랑 drop, create 권한을 주는 쿼리를 배웠습니다. 사실 1줄이면 간단하게 끝나는 거긴 합니다만, 글이 상당히 길어진 것은, 필요한 권한을 잘 주는 것이 상당히 중요하기 때문입니다.