오늘날 대부분의 웹 애플리케이션에는 최소한 몇 가지 기본 보안 전략이 필요합니다. 예를 들어 비밀번호로 보호된 콘텐츠를 제공하는 사이트, 관리자 백엔드만 있는 사이트, 블로그 및 개인 잡지, 전자 상거래 사이트, 기업 인트라넷 등이 있습니다.
이러한 유형의 웹 응용 프로그램을 구축하는 가장 일반적인 설계 접근 방식은 보안 정책을 웹 응용 프로그램의 비즈니스 논리에 통합하는 것입니다. 여기서 응용 프로그램은 사용자에게 데이터베이스의 특정 데이터에 액세스할 수 있는 권한이 있는지 여부를 결정합니다. 이 시나리오에서 데이터베이스의 역할은 단순히 데이터를 저장하고 요청 시 제공하는 것입니다. 즉, 웹 애플리케이션이 데이터베이스에 특정 정보를 제공하도록 명령하면 데이터베이스는 사용자의 권한을 확인하지 않고 직접 명령을 실행한다.
이 문서에서는 Oracle의 기본 제공 보안 기능을 활용하여 데이터베이스 수준에서 애플리케이션 보안 규칙을 적용하여 애플리케이션의 전반적인 보안을 향상시키는 방법을 알아봅니다. 부가적인 이점으로 데이터베이스에서 직접 데이터 액세스를 보호하면 애플리케이션 보안이 향상될 뿐만 아니라 복잡성도 줄어듭니다.
웹 애플리케이션의 데이터 액세스를 제어하기 위해
데이터베이스 측 보안이 필요한 이유
는 무엇입니까?대부분의 경우에는 문제가 없습니다. 이는 특히 관련 데이터가 업무상 중요하거나 일급 비밀이 아닌 경우 좋은 솔루션입니다. 이 방법은 많은 책과 온라인 리소스에서 사용됩니다. 실제로 한 인기 있는 PHP/MySQL 책에서는 "추가 사용자나 복잡한 권한으로 인해 진행하기 전에 더 많은 정보를 확인해야 하고 MySQL의 실행 속도가 느려질 수 있기 때문에" 애플리케이션당 둘 이상의 데이터베이스 사용자 계정을 생성하는 것을 명시적으로 권장하지 않습니다. 이는 사실입니다. 그러나 데이터베이스 논리에 보안을 통합하려는 아이디어를 포기하기 전에 고려해야 할 몇 가지 사항이 있습니다. 다음 예를 살펴보겠습니다.
콘텐츠 관리 시스템(CMS)을 만든다고 가정해 보겠습니다. 데이터베이스는 웹사이트에 게시된 콘텐츠를 저장하는 데 사용됩니다. 대부분의 데이터는 공개되어 익명의 웹 사용자가 읽을 수 있으며 편집자만 데이터를 변경할 수 있습니다. 단일 데이터베이스 계정을 사용하여 데이터베이스의 레코드에 액세스 및 수정하고, 관리자 전용 페이지에 대한 액세스를 비밀번호로 보호하여 PHP 코드로 보안을 제어합니다.
웹 애플리케이션의 공개 측이 공개 검색 양식(즉, 충분히 엄격하게 코딩되지 않은 양식)에 대한 SQL 주입과 같은 공격을 받는 경우 침입자는 데이터베이스 개체에 대해 임의의 SQL 문을 실행할 수 있습니다. 공개 계정에 액세스할 수 있습니다. 물론, 이 경우에는 데이터가 공개되어 있으므로 SELECT 문을 실행해도 큰 문제는 발생하지 않습니다. 그러나 공개 권한과 관리 권한은 동일한 데이터베이스 계정을 사용하기 때문에 침입자는 UPDATE 및 DELETE 문을 실행하거나 데이터베이스에서 테이블을 삭제할 수도 있습니다.
이런 일이 발생하지 않도록 하려면 어떻게 해야 합니까? 가장 간단한 방법은 공용 데이터베이스 계정의 데이터 수정 권한을 완전히 제한하는 것입니다. Oracle이 이 문제를 어떻게 해결하는지 살펴보겠습니다.
Oracle 보안의 기본 개요
Oracle Database는 웹 개발자에게 테이블, 뷰, 프로시저와 같은 특정 데이터베이스 개체에 대한 액세스 관리부터 개별 행이나 열의 데이터에 대한 액세스 제어에 이르기까지 데이터에 대한 액세스를 제어할 수 있는 다양한 방법을 제공합니다. 분명히 Oracle에서 사용할 수 있는 모든 보안 기능이나 옵션에 대한 논의는 이 기사의 범위를 벗어납니다. 여기에서는 너무 자세히 설명하지 않고 Oracle 데이터 액세스 보안의 가장 기본적인 측면만 다루겠습니다.
· 인증 및 사용자 계정 · 권한 · 역할
인증 및 사용자 계정. 다른 데이터베이스와 마찬가지로 Oracle에 대한 액세스를 요청하는 각 사용자(데이터베이스 계정)는 인증을 받아야 합니다. 검증은 데이터베이스, 운영 체제 또는 네트워크 서비스를 통해 수행될 수 있습니다. 기본 인증(비밀번호 인증) 외에도 Oracle은 Kerberos, CyberSafe, RADIUS 등과 같은 강력한 인증 메커니즘도 지원합니다.
역할. Oracle 역할은 명명된 권한 집합입니다. 사용자 계정 권한을 직접 부여할 수도 있지만 역할을 사용하면 특히 많은 수의 사용자를 관리해야 하는 경우 사용자 관리를 크게 단순화할 수 있습니다. 작고 관리 가능한 역할을 만든 다음 보안 수준에 따라 사용자에게 하나 이상의 역할을 부여하는 것은 매우 효율적입니다. 권한을 수정하는 것이 얼마나 쉬운지는 말할 것도 없고, 각 사용자 계정을 수정하는 대신 역할이 연결된 역할만 수정하면 됩니다.
새 사용자를 생성하는 초기 작업을 단순화하기 위해 Oracle에는 세 가지 사전 정의된 역할이 제공됩니다.
· CONNECT 역할 - 이 역할을 통해 사용자는 데이터베이스에 연결하고 자신의 테이블 생성과 같은 기본 작업을 수행할 수 있습니다. 기본적으로 이 역할은 다른 사용자의 테이블에 액세스할 수 없습니다.
·RESOURCE 역할 - RESOURCE 역할은 CONNECT 역할과 유사하지만 사용자가 트리거 또는 저장 프로시저 생성과 같은 더 많은 시스템 권한을 가질 수 있습니다.
·DBA 역할 - 사용자가 모든 시스템 권한을 갖도록 허용합니다.
사용 중인 권한 부여 및 권한
이 섹션에서는 이 문서의 시작 부분에서 설명한 간단한 CMS 예제의 보안을 향상시키기 위해 Oracle의 권한 부여 및 권한을 사용하는 방법에 대해 설명합니다. 애플리케이션 사용자에게 제공되는 콘텐츠는 WEB_CONTENT 테이블에 저장되어 있다고 가정합니다.
먼저 테이블을 생성합니다. Oracle Database Special Edition을 시작하고 시스템 관리자로 로그인합니다. 아직 릴리스되지 않은 경우 샘플 HR 사용자를 릴리스합니다. Special Edition 설치에 포함된 시작 안내서의 지침을 따르십시오. 기본적으로 HR 사용자에게는 RESOURCE 역할이 할당됩니다. 여기서는 CMS 응용 프로그램의 데이터베이스 측면을 관리하는 데 계정을 사용할 수 있도록 사용자에게 DBA 역할을 부여합니다. 물론 HR 사용자 계정은 온라인 액세스에는 사용되지 않고 데이터베이스 관리에만 사용됩니다.
이제 개체 브라우저를 사용하거나 SQL 명령 창을 실행하여 새 테이블을 생성할 수 있습니다. 다음은 테이블을 생성하는 코드입니다:
CREATE TABLE WEB_CONTENT (
page_id 숫자 기본 키,
page_content VARCHAR2(255)
);
테이블이 HR 사용자 계정을 사용하여 생성되었기 때문에 테이블은 HR 계정이 소유하고 HR 스키마에 있으며 다른 사용자는 테이블에 대한 액세스 권한을 명시적으로 부여받을 때까지 테이블에 액세스할 수 없습니다. 믿을 수 없다면 새 사용자를 생성하고 이 사용자를 사용하여 WEB_CONTENT 테이블에 액세스해 보세요.
이제 CMS_USER와 CMS_EDITOR라는 두 명의 새로운 사용자를 생성합니다. 마지막으로 CMS_USER에게는 WEB_CONTENT 테이블에 대한 읽기 전용 권한이 부여되며 이 사용자는 익명 웹 사용자로서 콘텐츠를 제공하는 데이터베이스 계정으로 사용됩니다. CMS_EDITOR 계정은 테이블에 대해 더 많은 권한을 가지며 CMS 편집자 계정(테이블의 데이터를 변경하고 유지하는 데 필요한 계정)으로 사용됩니다.
새로운 사용자는 XE의 그래픽 인터페이스를 사용하거나 다음 명령을 실행하여 생성할 수 있습니다.
CREATE USER cms_user IDENTIFIED BY cms_user;
cms_editor에 의해 식별된 사용자 생성 cms_editor;
(단순화를 위해 여기서 비밀번호는 사용자 이름에 해당합니다.)
두 계정 모두 데이터베이스에 로그인하려면 CONNECT 역할을 부여해야 합니다. 이렇게 하려면 XE 그래픽 인터페이스의 관리/데이터베이스 사용자 섹션에 있는 사용자 정보에서 CONNECT 확인란을 선택하거나 다음 명령을 실행합니다.
GRANT CONNECT to cms_user;
GRANT CONNECT to cms_editor;
이제 CMS_USER 또는 CMS_EDITOR 사용자로 로그인하여 WEB_CONTENT 테이블(hr.web_content에서 * 선택)에서 데이터를 읽으려고 하면 다음 오류가 발생합니다:
ORA-00942: 테이블 또는 뷰
존재하지 않습니다.
데이터에 액세스하거나 테이블만 보려면 CMS_USER 및 CMS_EDITOR 계정에 WEB_CONTENT 테이블에 대한 읽기 전용 권한을 부여해야 합니다.
GRANT SELECT on hr.web_content to cms_user;
GRANT SELECT on hr.web_content to cms_editor
위 코드를 사용하면 이 두 계정이 WEB_CONTENT 테이블에서 SELECT 문을 수행할 수 있습니다. 다른 문을 실행하려고 하면 오류가 발생합니다.
예를 들어,INSERT INTO hr.web_content (page_id,page_content) VALUES (1,'hello world');
행을 삽입하면
ORA-01031:
CMS_EDITOR가 이 테이블의 내용을 변경할 수 있는
권한
이 부족합니다.다음 권한을 부여해야 합니다.
hr.web_content에서 cms_editor에 대한 GRANT INSERT,UPDATE,DELETE
이제부터 CMS_EDITOR 계정은 WEB_CONTENT 테이블에서 INSERT, UPDATE 및 DELETE 문을 실행할 수 있습니다.
얼마나 쉬운지 확인해 보세요! 역할을 통해 권한을 관리하는 것이 더 효과적인 방법임을 알 수 있습니다. 사용된 Oracle 데이터베이스가 XE가 아닌 경우 다음 작업을 수행할 수 있습니다.
역할 생성:
CREATE ROLE reader;
CREATE ROLE 작성자
역할 권한 부여:
GRANT SELECT ON web_content TO 리더;
GRANT INSERT,UPDATE,DELETE ON web_content TO 작성자;
GRANT
reader TO cms_user;
cms_editor에 리더 부여(그들도 읽어야 함)
GRANTwriter TO cms_editor;
READER 역할의 정의를 변경하면 이러한 변경 사항은 해당 역할을 가진 모든 사용자 계정에 영향을 미칩니다. 권한이 사용자에게 직접 부여된 경우 각 사용자 계정을 개별적으로 업데이트해야 합니다.
위 단계를 완료한 후 익명 웹 사용자가 요청한 모든 데이터베이스 연결에 CMS_USER 계정을 사용하고 비밀번호로 보호된 관리 페이지에서 시작한 연결에 CMS_EDITOR 계정을 사용하도록 PHP 애플리케이션을 구성할 수 있습니다. 이제 공개 웹 양식이 손상되더라도 CMS_USER 계정에는 읽기 전용 권한만 있으므로 데이터베이스에 미치는 영향은 최소화됩니다.
결론
이 기사에서는 Oracle 데이터 액세스 보안의 가장 기본적인 기능 중 일부만 간략하게 소개했습니다. 또한 Oracle은 VPD(Virtual Private Database) 및 태그 보안을 포함하여 웹 애플리케이션의 보안을 한 단계 더 발전시키는 다양한 기능을 갖추고 있습니다.