คุณจะให้สิทธิ์ดำเนินการสำหรับขั้นตอนการจัดเก็บเดียวได้อย่างไร


40

ปกติเมื่อฉันสร้างโพรซีเดอร์ที่เก็บไว้ฉันจะใช้สิ่งต่อไปนี้เป็นเทมเพลตการเรียงลำดับ

Create procedure <procedurename>
<@param1 <type>, @param2 <type>, etc..> 
as begin

 <procedure>

end

มีวิธีการรวมการให้สิทธิ์ดำเนินการในขั้นตอนที่เก็บไว้ในขณะที่ฉันอยู่หรือไม่
ตัวอย่างเช่น ...

Grant execute [User_Execute] 

... แต่สำหรับขั้นตอนการจัดเก็บนี้เท่านั้น

ฉันเคยเห็นคำถามที่คล้ายกันอื่น ๆ แต่ดูเหมือนว่าพวกเขาทั้งหมดอ้างถึงขั้นตอนการจัดเก็บทั้งหมดไม่ใช่แค่คำถามเดียวและฉันไม่เคยเห็นคำถามที่คุณสามารถระบุสิทธิ์ภายในcreate procedureสคริปต์ได้ แม้แต่คำตอบเกี่ยวกับวิธีที่ฉันสามารถตั้งค่าการอนุญาตโดยไม่มี GUI สำหรับขั้นตอนการจัดเก็บเฉพาะจะยินดี

แก้ไข คำตอบยอดนิยมชี้ให้ฉันอย่างแม่นยำในทิศทางที่ถูกต้องนี่คือสิ่งที่ฉันกำลังมองหาฉันไม่ได้คิดเกี่ยวกับการรวมชุดคำสั่งซึ่งเป็นสิ่งที่ฉันทำลงไปการผสมคำสั่งพร้อมกับกระบวนการจัดเก็บของฉัน อย่างไรก็ตามฉันคิดว่ามันค่อนข้างเรียบ

Create procedure <procedurename>
<@param1 <type>, @param2 <type>, etc..> 
as begin

<procedure>

end
GO
GRANT EXECUTE ON <procedurename> to <username>
GO

รหัสที่ให้ไว้ในข้อความที่แก้ไขนั้นถูกต้องและคำตอบที่ถูกต้องสำหรับคำถามนี้
ninty9notout

คำตอบ:



10

ตัดทอนตารางการตั้งค่าการอนุญาตบนออบเจ็กต์เช่นกระบวนงานที่เก็บไว้สามารถทำได้ด้วย:

GRANT EXECUTE ON <schema>.<object> to <user>;

อย่างไรก็ตามคุณอาจต้องการให้สิทธิ์ด้านความปลอดภัยทั้งในระดับการเข้าสู่ระบบและผู้ใช้ คุณจะต้องกำหนดและให้สิทธิ์ที่จำเป็นสำหรับวัตถุที่ต้องมีการเข้าถึงเท่านั้น (เช่นการดำเนินการ) พิจารณาการใช้EXECUTE ASความสามารถในการปลอมตัวของผู้ใช้รายอื่นเพื่อตรวจสอบสิทธิ์ที่จำเป็นในการเรียกใช้โค้ดโดยไม่ต้องให้สิทธิ์ที่จำเป็นทั้งหมดแก่วัตถุต้นแบบทั้งหมด (เช่นตาราง) EXECUTE ASสามารถเพิ่มไปยังขั้นตอนการจัดเก็บฟังก์ชั่นทริกเกอร์ ฯลฯ

เพิ่มรหัสดังต่อไปนี้ถูกต้องภายในขั้นตอนการจัดเก็บ:

CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER

ในกรณีนี้คุณจะแอบอ้างเป็นเจ้าของโมดูลที่กำลังถูกเรียก นอกจากนี้คุณยังสามารถเลียนแบบ SELF หรือผู้ใช้ที่สร้างหรือแก้ไขโมดูล OR ... การเรียก CALLER ที่ไม่เหมาะสมซึ่งจะทำให้โมดูลสามารถรับสิทธิ์ของผู้ใช้ปัจจุบันหรือ ... เลียนแบบ OWNER ซึ่งจะต้องได้รับอนุญาตจาก เจ้าของโพรซีเดอร์ที่ถูกเรียกว่า OR ... เลียนแบบ 'user_name' ซึ่งจะปลอมตัวเป็นผู้ใช้เฉพาะหรือ OR ... เลียนแบบ 'login_name' ด้วยการปลอมตัวเป็นล็อกอินเฉพาะ

เวลาส่วนใหญ่คุณจะต้องให้EXECUTEสิทธิ์แก่ procs ที่จัดเก็บไว้เท่านั้นและจากนั้นจะให้สิทธิ์กับวัตถุทั้งหมดที่อ้างอิงภายใน proc ที่เก็บไว้

ด้วยวิธีนี้คุณไม่จำเป็นต้องให้สิทธิ์โดยนัย (ตัวอย่าง: เพื่ออัปเดตข้อมูลหรือโทร procs เพิ่มเติม) การผูกมัดความเป็นเจ้าของจะจัดการสิ่งนี้ให้คุณ นี้จะเป็นประโยชน์อย่างยิ่งสำหรับ SQL CREATE TABLEแบบไดนามิกหรือถ้าคุณจำเป็นต้องสร้างงานการรักษาความปลอดภัยสูงเช่น EXECUTE ASเป็นเครื่องมือที่มีประโยชน์ในการพิจารณาสำหรับสิ่งเหล่านี้

ตัวอย่างนี้อาจช่วยชี้แจงทั้งหมดนี้:

สร้างผู้ใช้ชื่อ NoPrivUser ด้วยการเข้าถึงฐานข้อมูลสาธารณะ (เช่น dbadb):

USE [master];
GO 
CREATE LOGIN [NoPrivUser] WITH PASSWORD=N'ABC5%', DEFAULT_DATABASE=[dbadb], 
  CHECK_EXPIRATION=ON, CHECK_POLICY=ON;
GO 
USE [DBAdb];
GO 
CREATE USER [NoPrivUser] FOR LOGIN [NoPrivUser];
GO

หมายเหตุ: ผู้สร้างหรือเจ้าของกระบวนการนี้จะต้องสร้างสิทธิ์ในตารางภายในฐานข้อมูลเป้าหมาย

use DBAdb 
go 
CREATE PROCEDURE dbo.MyProcedure 
WITH EXECUTE AS OWNER 

truncate table MyTable

GO
GRANT EXEC ON dbo.MyProcedure TO NoPrivUser; 
GO
-- Now log into your database server as NoPrivUser and run the following.

ด้วยส่วนEXECUTE ASคำสั่งกระบวนงานที่เก็บไว้จะทำงานภายใต้บริบทของเจ้าของวัตถุ รหัสนี้สร้างสำเร็จdbo.MyTableและแทรกแถวสำเร็จแล้ว ในตัวอย่างนี้ผู้ใช้NoPrivUserไม่มีสิทธิ์ที่ได้รับอนุญาตในการปรับเปลี่ยนตารางหรืออ่านหรือแก้ไขข้อมูลใด ๆ ในตารางนี้

จะใช้สิทธิ์ที่จำเป็นในการดำเนินงานเฉพาะนี้ให้เสร็จสิ้นภายในบริบทของกระบวนการนี้

วิธีการสร้างโพรซีเดอร์ที่เก็บไว้ซึ่งสามารถทำงานที่ต้องการสิทธิ์ความปลอดภัยที่ยกระดับโดยไม่ต้องกำหนดสิทธิ์เหล่านั้นอย่างถาวรจะมีประโยชน์มาก


4
นี่เป็นคำตอบเดียวกับที่คุณโพสต์บน SO เมื่อวานนี้ซึ่งฉันต้องฟอร์แมตเพื่อให้สามารถอ่านได้
Aaron Bertrand

5

ป้อนคำอธิบายรูปภาพที่นี่

เลือกฐานข้อมูลเข้าสู่ระบบ -> ไปที่ปลอดภัยและคลิกที่ปุ่มค้นหาเช่นเดียวกับในภาพก่อนหน้า เมื่อคลิกปุ่มค้นหาคุณจะพบหน้าต่างดังต่อไปนี้เพื่อเพิ่มประเภทของวัตถุ

คลิกที่ปุ่มประเภทวัตถุและคุณจะได้รับหน้าต่าง "เลือกประเภทวัตถุ" ที่มีวัตถุต่าง ๆ ตอนนี้ถ้าคุณเห็นกระบวนการจัดเก็บอยู่ในรายการในพื้นที่ประเภทวัตถุ ตอนนี้เราจะเลือกขั้นตอนการจัดเก็บเฉพาะของเราที่เราต้องการให้สิทธิ์


ข้อแรกคำถามมีอายุเกินห้าปีเมื่อคุณตอบคำถาม มันน่าจะใช้ได้ยกเว้น OP จะขอวิธีแก้ปัญหาที่ไม่ได้ใช้ GUI และสามารถฝังในสคริปต์ได้ คำตอบของคุณไม่ได้ระบุว่า
Eric Brandt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.