การตรวจสอบนโยบายรหัสผ่านเกี่ยวกับผู้ใช้ที่มีอยู่


11

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

ฉันใช้แบบสอบถามต่อไปนี้เพื่อรับรายการการเข้าสู่ระบบและไม่ว่าธงจะเปิดหรือปิด

select 
    @@SERVERNAME as servername, 
    name, 
    IS_SRVROLEMEMBER('sysadmin', name) as SYSADMIN,
    type_desc,
    create_date,
    is_policy_checked,
    is_disabled,
    password_hash,
    PWDCOMPARE(name, password_hash) as UsernameAsPassword
FROM sys.sql_logins

อย่างไรก็ตามสิ่งนี้ไม่ได้บอกฉันว่ารหัสผ่านนั้นเป็นไปตามนโยบายรหัสผ่านจริงหรือไม่เนื่องจากการตั้งค่าสถานะนั้นเกี่ยวข้องเฉพาะเมื่อสร้างผู้ใช้

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


1
การประชุมอะไร วันของ SQL Server BICC? ทำการค้นหาอย่างรวดเร็วดูเหมือนว่าไม่มีฟังก์ชั่นพื้นฐานที่จะให้ผลลัพธ์ที่รวดเร็วแก่คุณ อาจเป็นไปได้ที่จะใช้เครื่องมือของบุคคลที่สาม
Stijn Wynants

วันของ SQL Server ฉันได้ทำการค้นหาอย่างรวดเร็วเช่นกันและนอกเหนือจากเครื่องมือบางอย่างที่เพิ่งทำการโจมตีพจนานุกรมโดยใช้PWDCOMPARE()ฉันไม่ได้พบมากนักโดยไม่คำนึงถึงขอบคุณสำหรับความพยายาม!
Reaces

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

@CodesInChaos คุณจะตรวจสอบนโยบายในระหว่างเหตุการณ์เข้าสู่ระบบได้อย่างไร
Aaron Bertrand

1
ฉันได้ blogged เกี่ยวกับปัญหานี้ - และผมขอแนะนำให้ทุกท่านที่จะขึ้นเสียงและความคิดเห็นในรายการที่เชื่อมต่อ
Aaron Bertrand

คำตอบ:


15

นี้อาจไม่เป็นที่นิยมในหมู่ผู้ใช้ของคุณ แต่ผมเชื่อว่าวิธีเดียวที่คุณสามารถทราบว่าคือการบังคับให้เปลี่ยนรหัสผ่านสำหรับการเข้าสู่ระบบทุก SQL CHECK_POLICY = ONกับ สิ่งนี้จะสร้างชุดของALTER LOGINคำสั่งด้วยรหัสผ่านที่ว่างเปล่าคุณสามารถอัปเดตแบบสอบถามที่ให้รหัสผ่านทั่วไปทั้งหมดหรืออัปเดตแต่ละรายการด้วยรหัสผ่านแต่ละรายการ - เพียงตรวจสอบให้แน่ใจว่าพวกเขาปฏิบัติตามนโยบายของคุณ แน่นอนคุณต้องแน่ใจว่านโยบายรหัสผ่านนั้นซับซ้อนตามที่คุณคาดไว้และมีการเปิดใช้งาน (แผงควบคุม> เครื่องมือการดูแลระบบ> นโยบายความปลอดภัยในพื้นที่> นโยบายบัญชี> นโยบายรหัสผ่าน> รหัสผ่านจะต้องตรงตามข้อกำหนดด้านความซับซ้อน)

SELECT N'ALTER LOGIN ' + QUOTENAME(name) 
  + N' WITH PASSWORD = N'''' MUST_CHANGE, CHECK_POLICY = ON;' 
  FROM sys.sql_logins 
  --WHERE is_policy_checked = 0;

สตีฟโจนส์เขียนถึงเรื่องนี้สักพัก โปรดทราบว่า - เนื่องจากสิ่งที่ฉันค้นพบด้านล่าง - คุณไม่สามารถวางใจได้is_policy_checked = 1ว่ารหัสผ่านตรงตามนโยบายปัจจุบันของคุณเนื่องจากการเข้าสู่ระบบอาจสร้างด้วยรหัสผ่านที่ถูกแฮช (ในกรณีนี้รหัสผ่านข้อความธรรมดาไม่สามารถ ทำเครื่องหมาย) หรือในขณะที่นโยบายความซับซ้อนในพื้นที่ถูกปิดใช้งาน (ซึ่งยังคงนำไปสู่is_policy_checked = 1)

อีกวิธีหนึ่งที่ฉันคิดว่าน่าจะเป็นก็คือพยายามสร้างสำเนาของการเข้าสู่ระบบทุกครั้งด้วยการเข้าสู่ระบบในปัจจุบันpassword_hashและด้วยCHECK_POLICY = ONและจดบันทึกทุก ๆ การล้มเหลว อย่างไรก็ตามสิ่งนี้ไม่สามารถใช้งานได้ - แม้ว่าCHECK_POLICY = ONจะไม่ได้ทำการตรวจสอบรหัสผ่านที่แฮชแล้วก็ตาม ฉันจะรวมรหัสสำหรับลูกหลาน - แต่โดยการออกแบบนโยบายไม่สามารถตรวจสอบได้

SELECT N'BEGIN TRY
  CREATE LOGIN ' + QUOTENAME(N'copy_of_' + name) 
    + N' WITH PASSWORD = ' 
    + CONVERT(NVARCHAR(255), password_hash, 1)
    + ' HASHED, CHECK_POLICY = ON;
  DROP LOGIN ' + QUOTENAME(N'copy_of_' + name) + ';
END TRY
BEGIN CATCH
  IF ERROR_NUMBER() = 15118
    PRINT N''' + REPLACE(name, '''', '''''') 
      + N' was not complex enough.'';
END CATCH'
FROM sys.sql_logins;

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

อัปเดต : ฉันยื่นข้อผิดพลาดกับพฤติกรรมนี้


ความยุ่งยากอีกประการคือฉันค่อนข้างแน่ใจว่าผู้ดูแลระบบคนก่อนหน้าเพิ่งตรวจสอบนโยบายนี้หลังจากใส่รหัสผ่านที่จำได้ง่าย select @@SERVERNAME as servername, name FROM sys.sql_logins where PWDCOMPARE(name, password_hash) = 1 AND is_policy_checked = 1;ให้ผลในเชิงบวกหลายประการ ดังนั้นฉันจะต้องทำเช่นนี้สำหรับการเข้าสู่ระบบทั้งหมดไม่ใช่เฉพาะผู้ที่is_policy_checkedปิดใช้งาน
Reaces

@ อาจเป็นไปได้ หรือนโยบายรหัสผ่านของคุณใน Windows อาจอ่อนแอหรือถูกปิดใช้งานดังนั้นการพยายามบังคับใช้นโยบายจึงไม่ได้ช่วย
Aaron Bertrand

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

"มันไม่ทำการตรวจสอบความถูกต้องของรหัสผ่านที่ถูกแฮชแล้ว" มันจะทำอย่างไร? หากคุณรู้จักแฮชและไม่ใช่รหัสผ่านธรรมดาคุณจะไม่สามารถตรวจสอบความซับซ้อนของรหัสผ่านได้ คุณสามารถเดารหัสผ่านได้ แต่นั่นอาจมีราคาแพงมากสำหรับการแฮชรหัสผ่านที่เหมาะสมเนื่องจากจุดแฮชรหัสผ่านทั้งหมดป้องกันการกู้คืนรหัสผ่านธรรมดา
CodesInChaos

@CodesInChaos ฉันรู้ว่านั่นคือจุดของฉัน ... ฉันพูดว่า "ไม่" แต่อาจมีการเขียนว่า "ไม่น่าจะเป็นไปได้" ...
Aaron Bertrand

4

ไม่มีทางที่คุณจะได้รับความแม่นยำ 100% แม้ว่าคุณสามารถใช้PWDCOMPAREเพื่อตรวจสอบกับรายการของรหัสผ่านที่อ่อนแอ (คุณสามารถเพิ่มลงในรายการของรหัสผ่านที่อ่อนแอและทำการเปรียบเทียบ)

ฉันได้เขียนสคริปต์ที่คล้ายกันซึ่งทำการเปรียบเทียบและให้ผลลัพธ์กับคุณ ผมได้โพสต์ไว้บนGitHub

แก้ไข:

ตอนนี้คุณสามารถมีรายการรหัสผ่านที่อ่อนแอใน csv แล้วใช้ dbatools Test-DbaLoginPasswordพร้อม -Dictionaryสวิตช์ (ระบุรายการรหัสผ่านเพื่อรวมไว้ในการทดสอบสำหรับรหัสผ่านที่อ่อนแอ)


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

0

นโยบายรหัสผ่านสำหรับการเข้าสู่ระบบ SQL เป็นเพียงการตั้งค่าสถานะเป็นเปิดหรือปิด หากการตรวจสอบการตั้งค่าสถานะนโยบายรหัสผ่านแสดงว่านโยบายรหัสผ่าน Windows จากระบบปฏิบัติการถูกบังคับใช้

ตรวจสอบเอกสารประกอบ CREATE LOGIN เพื่อดูรายละเอียดว่าจะเกิดอะไรขึ้นเมื่อ CHECK_POLICY และ CHECK_EXPIRATION ถูกตั้งค่า

คุณสามารถดูการตั้งค่าต่อผู้ใช้ SQL ได้โดยตรวจสอบคอลัมน์ is_policy_checked และ is_expiration_checked ใน sys.sql_logins

สิ่งที่ต้องการด้านล่าง:

SELECT name,
create_date,
modify_date,
LOGINPROPERTY(name, 'DaysUntilExpiration') DaysUntilExpiration,
LOGINPROPERTY(name, 'PasswordLastSetTime') PasswordLastSetTime,
LOGINPROPERTY(name, 'IsExpired') IsExpired,
LOGINPROPERTY(name, 'IsMustChange') IsMustChange
From sys.sql_logins ;

สำหรับการเข้าสู่ระบบการรับรองความถูกต้องของเซิร์ฟเวอร์ SQL:

select * from sys.server_principals where type in ('U','G') - จะแสดงการเข้าสู่ระบบและกลุ่มที่สามารถเข้าถึง SQL Server ผ่าน Windows Authentication


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