ฉันคิดว่าคุณกำลังคุยกัน การตรวจสอบและอนุมัติ
ฉันยอมรับอย่างสมบูรณ์ว่าการรักษารูปแบบความปลอดภัยในฐานข้อมูลนั้นฉลาดโดยเฉพาะอย่างยิ่ง LedgerSMB ได้รับการออกแบบโดยคำนึงถึงการเข้าถึงจากลูกค้าหลายราย ถ้าคุณวางแผนว่าจะไป 3 ชั้นมีชั้นตัวกลางก็จะทำให้สมบูรณ์แบบความรู้สึกที่มีผู้ใช้เป็นบทบาทของฐานข้อมูลโดยเฉพาะอย่างยิ่งบางอย่างเช่นแอปบัญชี
สิ่งนี้ไม่ได้หมายความว่าคุณจะต้องพิสูจน์ตัวตนผู้ใช้กับฐานข้อมูลโดยใช้วิธีการพิสูจน์ตัวตนที่รองรับ PostgreSQL ผู้ใช้ฐานข้อมูลบทบาทและเงินช่วยเหลือของคุณสามารถนำไปใช้เพื่อขออนุมัติได้เฉพาะในกรณีที่คุณต้องการ
นี่คือวิธีการทำงานสำหรับ web UI
jane
เชื่อมต่อกับเซิร์ฟเวอร์ web ui และรับรองความถูกต้องโดยใช้วิธีการใดก็ได้ที่ต้องการกล่าวว่าจับมือใบรับรองลูกค้า HTTPS X.509 และ DIGEST รับรองความถูกต้อง ตอนนี้เซิร์ฟเวอร์มีการเชื่อมต่อจากผู้ใช้ที่ยอมรับได้จริง ๆjane
ๆ
เซิร์ฟเวอร์เชื่อมต่อกับ PostgreSQL โดยใช้ username / password คงที่ (หรือ Kerberos หรือสิ่งที่คุณต้องการ), webui
การตรวจสอบสิทธิ์ของตนเองไปยังเซิร์ฟเวอร์ฐานเป็นผู้ใช้ เซิร์ฟเวอร์ db เชื่อถือได้webui
เพื่อรับรองความถูกต้องของผู้ใช้ดังนั้นจึงwebui
ได้รับGRANT
s ที่เหมาะสม(ดูด้านล่าง)
ในการเชื่อมต่อที่เซิร์ฟเวอร์ที่ใช้จะถือว่าอยู่ในระดับที่ได้รับอนุญาตจากผู้ใช้SET ROLE jane;
jane
จนกว่าจะมีการเรียกใช้RESET ROLE;
หรืออื่นSET ROLE
การเชื่อมต่อจะทำงานโดยมีสิทธิ์การเข้าถึงเดียวกันกับjane
และSELECT current_user()
ฯลฯ jane
จะรายงาน
เซิร์ฟเวอร์รักษาการเชื่อมโยงระหว่างการเชื่อมต่อฐานข้อมูลที่มีSET ROLE
กับjane
และเซสชันของเว็บสำหรับผู้ใช้jane
ไม่อนุญาตให้การเชื่อมต่อ PostgreSQL นั้นถูกใช้โดยการเชื่อมต่ออื่น ๆ กับผู้ใช้อื่นโดยไม่มีใหม่SET ROLE
inbetween
ตอนนี้คุณกำลังตรวจสอบสิทธิ์ภายนอกเซิร์ฟเวอร์ แต่ทำการบำรุงรักษาสิทธิ์ในเซิร์ฟเวอร์ Pg จำเป็นต้องรู้ว่าผู้ใช้มีอยู่จริง แต่ไม่ต้องการรหัสผ่านหรือวิธีการตรวจสอบสิทธิ์สำหรับพวกเขา
ดู:
รายละเอียด
เซิร์ฟเวอร์ webui ควบคุมการสืบค้นที่เรียกใช้และจะไม่ปล่อยให้jane
รัน SQL ดิบ (ฉันหวังว่า!) ดังนั้นจึงjane
ไม่สามารถRESET ROLE; SET ROLE special_admin_user;
ผ่านเว็บ UI ได้ เพื่อความปลอดภัยที่เพิ่มขึ้นฉันจะเพิ่มตัวกรองคำสั่งไปยังเซิร์ฟเวอร์ที่ปฏิเสธSET ROLE
และRESET ROLE
เว้นแต่ว่าการเชื่อมต่อนั้นอยู่ในหรือเข้าสู่กลุ่มการเชื่อมต่อที่ไม่ได้กำหนด
คุณยังสามารถใช้การรับรองความถูกต้องโดยตรงกับ Pg ในไคลเอนต์อื่น ๆ ได้ฟรี คุณสามารถผสมและจับคู่ได้อย่างอิสระ คุณเพียงแค่ต้องใช้สิทธิกับผู้ใช้ที่สามารถเข้าสู่ระบบผ่านทางเว็บและจากนั้นให้ผู้ใช้ปกติใด ๆสิทธิ, รหัสผ่าน, ฯลฯ ที่คุณต้องการ หากคุณต้องการทำให้เป็นเว็บเท่านั้นสิทธิ์ของพวกเขาในฐานข้อมูล (และจากGRANT
webui
SET ROLE
CONNECT
REVOKE
CONNECT
public
)
ในการทำให้การรับรองความถูกต้อง / การอนุญาตแยกง่ายฉันมีบทบาทพิเศษassume_any_user
ที่ฉันGRANT
ทุกคนสร้างขึ้นใหม่เพื่อ ฉันGRANT assume_any_user
ชื่อผู้ใช้จริงที่ใช้โดยสิ่งต่าง ๆ เช่นส่วนหน้าเว็บที่เชื่อถือได้ให้สิทธิ์พวกเขาในการเป็นผู้ใช้ที่พวกเขาชอบ
เป็นสิ่งสำคัญที่จะต้องassume_any_user
มีNOINHERIT
บทบาทดังนั้นwebui
ผู้ใช้หรือสิ่งใดก็ตามที่ไม่มีสิทธิ์ของตนเองและสามารถดำเนินการกับฐานข้อมูลได้เมื่อSET ROLE
มีการใช้งานจริง ภายใต้สถานการณ์ที่ไม่ควรwebui
จะเป็น superuser หรือเจ้าของ
หากคุณกำลังเชื่อมต่อร่วมกันคุณสามารถใช้SET LOCAL ROLE
กับบทบาทชุดเฉพาะในการทำธุรกรรมเพื่อให้คุณสามารถกลับมาเชื่อมต่อกับสระว่ายน้ำหลังหรือCOMMIT
ROLLBACK
ระวังว่าRESET ROLE
ยังใช้งานได้ดังนั้นจึงยังไม่ปลอดภัยที่จะให้ไคลเอนต์เรียกใช้ SQL ที่พวกเขาต้องการ
SET SESSION AUTHORIZATION
เป็นเวอร์ชันที่เกี่ยวข้อง แต่แข็งแกร่งกว่าของคำสั่งนี้ มันไม่จำเป็นต้องเป็นสมาชิกของบทบาท แต่เป็นคำสั่ง superuser เท่านั้น คุณไม่ต้องการให้ UI ของเว็บเชื่อมต่อเป็น superuser มันสามารถกลับด้วยRESET SESSION AUTHORIZATION
, SET SESSION AUTHORIZATION DEFAULT
หรือSET SESSION AUTHORIZATION theusername
จะฟื้นสิทธิ superuser จึงไม่เป็นอุปสรรคการรักษาความปลอดภัยสิทธิ์ลดลงอย่างใดอย่างหนึ่ง
คำสั่งที่ทำงานเหมือน SET SESSION AUTHORIZATION
แต่กลับไม่ได้และจะทำงานได้ถ้าคุณเป็นสมาชิกบทบาท แต่ไม่ใช่ superuser จะดีมาก ถึงตอนนี้ยังไม่มีสักเครื่อง แต่คุณยังสามารถแยกการพิสูจน์ตัวตนและการอนุญาตได้ดีถ้าคุณระวัง
ตัวอย่างและคำอธิบาย
CREATE ROLE dbowner NOLOGIN;
CREATE TABLE test_table(x text);
INSERT INTO test_table(x) VALUES ('bork');
ALTER TABLE test_table OWNER TO dbowner;
CREATE ROLE assume_any_user NOINHERIT NOLOGIN;
CREATE ROLE webui LOGIN PASSWORD 'somepw' IN ROLE assume_any_user;
CREATE ROLE jane LOGIN PASSWORD 'somepw';
GRANT jane TO assume_any_user;
GRANT ALL ON TABLE test_table TO jane;
CREATE ROLE jim LOGIN PASSWORD 'somepw';
GRANT jim TO assume_any_user;
webui
ตอนนี้เชื่อมต่อเป็น โปรดทราบว่าคุณไม่สามารถทำอะไรให้test_table
แต่คุณสามารถ SET ROLE
ไปjane
และจากนั้นคุณสามารถเข้าถึงtest_table
:
$ psql -h 127.0.0.1 -U webui regress
Password for user webui:
regress=> SELECT session_user, current_user;
session_user | current_user
--------------+--------------
webui | webui
(1 row)
regress=> SELECT * FROM test_table;
ERROR: permission denied for relation test_table
regress=> SET ROLE jane;
SET
regress=> SELECT session_user, current_user;
session_user | current_user
--------------+--------------
webui | jane
(1 row)
regress=> SELECT * FROM test_table;
x
------
bork
(1 row)
โปรดทราบว่าwebui
สามารถ SET ROLE
ไปjim
แม้ในขณะที่แล้วSET ROLE
วันที่ไปjane
และแม้ว่าjane
ยังไม่ได้รับการGRANT
ed jim
สิทธิที่จะถือว่าบทบาท SET ROLE
ตั้งค่า ID ผู้ใช้ที่มีประสิทธิภาพของคุณ แต่ไม่ได้ลบความสามารถของคุณไปSET ROLE
ยังบทบาทอื่น ๆ นั่นเป็นคุณสมบัติของบทบาทที่คุณเชื่อมต่อไม่ใช่บทบาทที่มีประสิทธิภาพในปัจจุบันของคุณ ดังนั้นคุณต้องควบคุมการเข้าถึงคำสั่งSET ROLE
และ RESET ROLE
นั่นคือ AFAIK ไม่มีวิธีใดในSET ROLE
การเชื่อมต่ออย่างถาวรกลายเป็นผู้ใช้เป้าหมายอย่างแท้จริงแม้ว่าจะเป็นสิ่งที่ดีจริงๆ
เปรียบเทียบ:
$ psql -h 127.0.0.1 -U webui regress
Password for user webui:
regress=> SET ROLE jane;
SET
regress=> SET ROLE jim;
SET
regress=> SELECT session_user, current_user;
session_user | current_user
--------------+--------------
webui | jim
(1 row)
ถึง:
$ psql -h 127.0.0.1 -U jane regress
Password for user jane:
regress=> SET ROLE webui;
ERROR: permission denied to set role "webui"
regress=> SET ROLE jim;
ERROR: permission denied to set role "jim"
ซึ่งหมายความว่าSET ROLE
ไม่เหมือนกับการเข้าสู่ระบบตามบทบาทที่กำหนดสิ่งที่คุณต้องจำไว้
webui
ไม่สามารถSET ROLE
ที่จะdbowner
เพราะมันไม่ได้รับการGRANT
ed ที่ขวา:
regress=> SET ROLE dbowner;
ERROR: permission denied to set role "dbowner"
ดังนั้นโดยตัวของมันเองมันไม่มีพลังงานเลยมันสามารถรับสิทธิ์ของผู้ใช้รายอื่นได้และเมื่อผู้ใช้เหล่านั้นเปิดใช้งานการเข้าถึงเว็บ