2013-04-17 2 views
3

저는 postgresql 9.2 데이터베이스 백엔드가있는 C++ 응용 프로그램을 작성하고 있습니다. 그것은 회계 소프트웨어입니다. 권한 분리 기능을 가진 muti 사용자 응용 프로그램입니다.권한 구분이있는 다중 사용자 데스크탑 응용 프로그램

사용자 계정 시스템을 구현하는 데 도움이 필요합니다. 사용자를위한 권한은 상호 배타적 일 필요는 없습니다. 애플리케이션 레벨 또는 데이터베이스 레벨에서 구현해야합니까?

회사 규모는 현재 크지 않습니다. 사무실 당 약 10 명의 프로그램 사용자가있는 약 15-20 개의 사무실을 가정합니다.

  • 이것을 구현하기 위해 포스트그레스에서 역할을 사용할 수 있습니까? 너무 지루하고 관리하기 어려워 지거나 그런 접근 방식에 결함이 있습니까?
  • 응용 프로그램 경로를 거쳐 사용자에게 부여 된 권한 집합을 저장하려면 어떻게해야합니까? 이진 문자열로 충분합니까? 나중에 추가 권한이 있다면 어떻게 통합 할 수 있습니까? 보안 문제가 발생하지 않도록하려면 어떻게해야합니까? 그리고 이러한 접근 방식에서는 응용 프로그램이 가장 권한이있는 사용자에게 필요한 권한과 연결된다고 가정합니다.
  • 두 가지 방법 중 일부 조합은 무엇입니까? 아니면 완전히 다른 무엇인가?

모든 제안과 주장을 환영합니다.

답변

1

통제되지 않은 환경에서 실행되는 클라이언트 응용 프로그램의 승인을 절대로 제공하지 마십시오. 그리고 사용자가 물리적으로 액세스 할 수있는 모든 장치는 통제되지 않은 환경입니다. 이것은 무명 보안을 의미합니다 — 사용자는 클라이언트 프로그램 메모리에서 데이터베이스 액세스 자격 증명을 얻고 단지 psql을 사용하여 디버거를 사용하면됩니다.

역할을 사용하십시오.

내가 C++/PostgreSQL 데스크톱 응용 프로그램을 개발할 때 모든 사용자가 모든 테이블을 수정할 수 없도록 선택했으며 VOLATILE SECURITY DEFINER 옵션이있는 Pl/PgSQL 함수를 사용하여 API를 만들었습니다. 예를 들어, 사용하기 쉬운 자연과 오류 아니다 그러나 나는 그것이 최선의 방법이 아니었다 생각 :

select add_person(?,?,?,?,?,?,?,?,?,?,?,?); 

내가 더 좋은 방법은 사용자가 수정할 필요가 테이블에 대한 수정을 허용하는 것입니다 생각, 필요할 때, BEFORE 트리거를 사용하여 권한 부여를 시행하십시오. 그러면 current_user가 적절한 역할에 속하지 않을 때 오류가 발생합니다.

그러나 remember to use set search_path=... option in all functions that have anything to do with security.


일부 테이블에 대해 읽기 전용 액세스 권한을 부여하려는 경우 더욱 복잡해집니다. 이 테이블에 대한 선택 특권을 사용 불가능하게하거나 모든 데이터에 액세스하기위한 보안 정의 함수를 사용하여 API를 작성해야합니다. 이것은 매우 괴상하고 매우 약해 괴물 크기의 API가 될 것입니다. 또는 create view with (security_barrier)을 사용하여이 테이블에 대한 선택 권한을 사용 중지하고 뷰를 생성해야합니다. 또한 귀여워하지 않습니다.

+0

답변 해 주셔서 감사합니다. 몇 가지 질문이 있습니다. 1. 사용자가 기술 지향적이지 않은 경우에는 어떻게해야합니까? 그리고 디버거 방식을 사용하는 것은 거의 불가능합니다. – Richard

+0

2. 제가 생각할 수있는 또 다른 접근법은 postgres 역할을 사용하는 것입니다. 역할 (로그인 권한 없음)을 사용하여 탭 그룹 (Linux 그룹과 같은)에 대한 특권을 정의하십시오. 로그인 권한과 필요한 권한 조합 (이전 그룹 역할을 상속 함으로 구현 됨)을 사용하여 새 역할을 만듭니다.이제 실제 사용자를이 포스트그레스 사용자 (사용자 역할)에 매핑하는 사용자 테이블을 만듭니다. Naturailly, 일부 사용자 (조직의 관리자/관리자)에게 추가 사용자 역할을 만들거나 적절한 역할을 그룹화 할 수있는 권한이 부여됩니다. – Richard

+0

또 다른 질문으로 다른 보안 인증 방법을 사용할 수 있습니까? 나는 그들 모두를 잘 알고 있지도 않고 잘 작동하지도 않는다는 것을 알고 있지만 (나는 이것을 지원할 연구가 없다) 서버에서 자신을 인증하기 위해 응용 프로그램이 사용할 수있는 또 다른 인증 방법이 있어야한다고 생각한다. 악의적 인 사용자가 복제 할 수 없습니다. 당신의 생각은 무엇입니까? – Richard

관련 문제