MySql : 읽기 전용 옵션을 부여 하시겠습니까?


97

DB 스키마에 대한 모든 READ 권한을 부여하려는 사용자가 있습니다.

한 가지 방법은 다음과 같습니다.

GRANT SELECT, SHOW_VIEW  ON test.* TO 'readuser'@'%';

모든 읽기 작업을 허가로 그룹화하는 방법이 있습니까?


권한은 SHOW VIEW, 아니지만 뷰에서 SHOW_VIEW할 수 있도록하지 않는 한 사용자에게이를 부여 할 필요가 없습니다. 사용자 SHOW CREATE VIEWSELECT권한 만있는 뷰에서 선택할 수 있습니다 . "모든 읽기 작업을 허가로 그룹화"한다는 것은 무엇을 의미합니까?
Michael-sqlbot 2013

데이터베이스에 대한 모든 읽기 작업을 나타내는 단일 권한이있는 경우. 나는 그들이 세밀한 액세스를 제공하고 있음을 이해하지만 편리한 높은 수준의 추상화가 도움이되었을 것입니다.
Ajeet Ganga 2013

답변:


161

데이터베이스에 대한 모든 읽기 작업을 나타내는 단일 권한이있는 경우.

"모든 읽기"를 정의하는 방법에 따라 다릅니다.

테이블과 뷰에서 "읽기"는 SELECT특권입니다. 이것이 "모두 읽음"의 의미라면 예 :

GRANT SELECT ON *.* TO 'username'@'host_or_wildcard' IDENTIFIED BY 'password';

그러나 그것은 당신이 모든 것을 "볼 수있는"능력, "보지만 만지지 않는"능력을 의미하는 것처럼 들립니다. 여기에 떠오르는 다른 종류의 독서가 있습니다.

보기의 정의를 "읽는"것은 SHOW VIEW 특권입니다.

다른 사용자가 현재 실행중인 쿼리 목록을 "읽는"것은 PROCESS 권한이 있습니다.

현재 복제 상태를 "읽는 중"은 REPLICATION CLIENT 권한입니다.

이들 중 일부 또는 전부는 해당 사용자의 특성에 따라 노출하려는 것보다 더 많은 정보를 노출 할 수 있습니다.

그것이 당신이 원하는 읽기라면, 그것들 중 하나 (또는 사용 가능한 다른 권한들 )를 하나의 GRANT문장으로 결합 할 수 있습니다 .

GRANT SELECT, SHOW VIEW, PROCESS, REPLICATION CLIENT ON *.* TO ...

그러나 다른 권한의 일부 하위 집합을 부여하는 단일 권한은 없습니다.

수동으로 작업을 수행하고 특정 사용자 클래스에 대해 일반적으로 부여하는 정확한 부여를 기억할 필요없이이 작업을 더 쉽게 수행 할 수있는 방법을 찾고 있다면, 비슷한 사용자의 부여를 재생성하는 문을 찾아서 변경할 수 있습니다. 비슷한 권한을 가진 새 사용자를 만들려면 :

mysql> SHOW GRANTS FOR 'not_leet'@'localhost';
+------------------------------------------------------------------------------------------------------------------------------------+
| Grants for not_leet@localhost                                                                                                      |
+------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, REPLICATION CLIENT ON *.* TO 'not_leet'@'localhost' IDENTIFIED BY PASSWORD '*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' |
+------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

암호와 함께 추가하려는 새 사용자와 일치하도록 'not_leet'및 'localhost'를 변경하면 재사용이 가능합니다. GRANT 를 만드는 문이 생성됩니다.

한 번의 작업으로 제한된 권한 집합을 설정하고 사용자에게 부여하고, 장점이없는 권한을 제거하려는 경우 수행하려는 모든 작업을 캡슐화하는 저장 프로 시저를 만들어 수행 할 수 있습니다. 절차의 본문 내에서GRANT 동적 SQL을 문을 작성하거나 그랜트 테이블 자체를 직접 조작합니다.

에서 데이터베이스 관리자에이 최근 문제 정의에 꽤 많은 다른 사용자입니다을 수정할 수있는 사용자가 아닌 - 포스터는 일반적으로 할 수있는 일이 아닙니다 물론 다른 사용자를 수정할 수있는 권한이없는 사용자의 능력을 원했다 그러나 권한이없는 사용자는 저장 프로 시저가 해당 DEFINER사용자 의 보안 컨텍스트로 실행 되므로 EXECUTE프로 시저에 대한 권한이있는 모든 사용자 가 일시적으로 에스컬레이션 된 권한을 가정하여 특정 작업을 수행 할 수 있기 때문에 좋은 솔루션을 제공했습니다 . 절차가 완료됩니다.


1
감사. 훌륭한 답변 외에도 비밀번호도 마음에 들었습니다. :)
Ajeet Ganga 2015 년

2
주의 할 점 : PROCESS 및 REPLICATION CLIENT는 "전역"권한 유형이므로 "데이터베이스 별"제외로 정의하면 구문이 실패합니다. GRANT PROCESS ON mydb. *는 유효하지 않지만 GRANT PROCESS ON *. *는 괜찮습니다.
Bee Kay

GRANT SELECT ON db_name. * TO 'demo'@ '%'WITH GRANT OPTION;
Musa

16
GRANT SELECT ON *.* TO 'user'@'localhost' IDENTIFIED BY 'password';

이것은 SELECT뷰를 포함한 모든 데이터베이스에 대한 권한을 가진 사용자를 생성합니다 .


9

사용자에게 부여 할 수있는 다양한 권한은

ALL PRIVILEGES- This would allow a MySQL user all access to a designated database (or if no database is selected, across the system)
CREATE- allows them to create new tables or databases
DROP- allows them to them to delete tables or databases
DELETE- allows them to delete rows from tables
INSERT- allows them to insert rows into tables
SELECT- allows them to use the Select command to read through databases
UPDATE- allow them to update table rows
GRANT OPTION- allows them to grant or remove other users' privileges

특정 사용자에게 권한을 제공하려면 다음 프레임 워크를 사용할 수 있습니다.

GRANT [type of permission] ON [database name].[table name] TO ‘[username]’@'localhost’;

기사가 매우 유용 하다는 것을 알았습니다.


3

여기 에서 찾은 단계별 가이드 .

MySQL에 대한 읽기 전용 데이터베이스 사용자 계정을 만들려면

UNIX 프롬프트에서 MySQL 명령 줄 프로그램을 실행하고 다음 명령을 입력하여 관리자로 로그인합니다.

mysql -u root -p

루트 계정의 비밀번호를 입력하십시오. mysql 프롬프트에서 다음 단계 중 하나를 수행하십시오.

사용자에게 호스트에서 데이터베이스에 대한 액세스 권한을 부여하려면 다음 명령을 입력하십시오.

grant select on database_name.* to 'read-only_user_name'@'%' identified by 'password';

수집기가 데이터베이스와 동일한 호스트에 설치되는 경우 다음 명령을 입력합니다.

grant select on database_name.* to 'read-only_user_name' identified by 'password';

이 명령은 사용자에게 로컬 호스트에서만 데이터베이스에 대한 읽기 전용 액세스 권한을 부여합니다. 콜렉터가 설치 될 호스트의 호스트 이름 또는 IP 주소를 알고있는 경우 다음 명령을 입력하십시오.

grant select on database_name.* to 'read-only_user_name'@'host_name or IP_address' identified by 'password';

호스트 이름은 DNS 또는 로컬 호스트 파일로 확인할 수 있어야합니다. mysql 프롬프트에서 다음 명령을 입력합니다.

flush privileges;

유형 quit.

다음은 예제 명령 및 확인 메시지 목록입니다.

mysql> grant select on dbname.* to 'readonlyuser'@'%' identified 
by 'pogo$23';
Query OK, 0 rows affected (0.11 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> quit

3

사용자도 답변을 받았으며 @Michael-sqlbot은 그의 게시물에서 대부분의 포인트를 매우 잘 다루었지만 한 가지 포인트가 누락되었으므로 커버하려고합니다.

간단한 사용자에게 읽기 권한을 제공하려는 경우 (관리자가 아닌)-

GRANT SELECT, EXECUTE ON DB_NAME.* TO 'user'@'localhost' IDENTIFIED BY 'PASSWORD';

참고 : 보고서를 생성하는 저장 프로 시저가있는 경우 사용자가 데이터를 읽을 수 있도록 여기에 EXECUTE가 필요합니다 (select 문이 거의 없음).

localhost를 사용자가 DB에 연결할 특정 IP로 바꿉니다.

추가 읽기 권한은 다음과 같습니다.

  • SHOW VIEW : 뷰 스키마를 표시하려는 경우.
  • REPLICATION CLIENT : 사용자가 복제 / 슬레이브 상태를 확인해야하는 경우. 그러나 모든 DB에 대한 권한을 부여해야합니다.
  • PROCESS : 사용자가 실행중인 프로세스를 확인해야하는 경우. 모든 DB에서만 작동합니다.

0

읽기 권한을 부여한 후에보기를 읽기 전용으로하려면 DDL 정의보기에서 ALGORITHM = TEMPTABLE을 사용할 수 있습니다.


0

MySQL 8에 대한 참고 사항은 다릅니다.

다음 두 단계로 수행해야합니다.

CREATE USER 'readonly_user'@'localhost' IDENTIFIED BY 'some_strong_password';
GRANT SELECT, SHOW VIEW ON *.* TO 'readonly_user'@'localhost';
flush privileges;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.