ฉันจะปิดการหมดอายุของรหัสผ่าน Oracle ได้อย่างไร


177

ฉันใช้ Oracle เพื่อการพัฒนา รหัสผ่านสำหรับบัญชี bootstrap ที่ฉันใช้เพื่อสร้างฐานข้อมูลของฉันใหม่หมดอายุแล้ว

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

ฉันใช้ Oracle 11g ซึ่งมีรหัสผ่านหมดอายุตามค่าเริ่มต้น


ฉันคิดว่าคุณน่าจะถามคำถามนี้ได้ดีกว่าบน serverfault.com ฉันจะไม่บังคับเพราะคุณบอกว่าคุณใช้มันเพื่อการพัฒนาและฉันคิดว่ายังมีโอกาสที่บางคนที่นี่จะรู้และ / หรือคนอื่น ๆ ที่นี่อาจได้รับประโยชน์จากข้อมูลนี้
Bill the Lizard

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

ไม่แน่ใจว่านโยบาย dupe คืออะไรสำหรับคำถามข้ามไซต์ แต่นี่คือลิงก์: serverfault.com/questions/37622/…
Josh Kodroff

คำตอบ:


313

หากต้องการแก้ไขนโยบายการหมดอายุของรหัสผ่านสำหรับโปรไฟล์ผู้ใช้ที่แน่นอนใน Oracle ให้ตรวจสอบโปรไฟล์ที่ผู้ใช้ใช้ก่อน:

select profile from DBA_USERS where username = '<username>';

จากนั้นคุณสามารถเปลี่ยนขีด จำกัด เป็นไม่หมดอายุโดยใช้:

alter profile <profile_name> limit password_life_time UNLIMITED;

หากคุณต้องการตรวจสอบวงเงินก่อนหน้านี้คุณสามารถใช้:

select resource_name,limit from dba_profiles where profile='<profile_name>';

5
การเปลี่ยนแปลงนี้โปรไฟล์ อย่างไรก็ตามฉันมีผู้ใช้ที่ตั้งรหัสผ่านให้หมดอายุเนื่องจากโปรไฟล์เริ่มต้นมีเช่นเมื่อสร้างขึ้น ฉันจะเปลี่ยนบัญชีผู้ใช้เหล่านี้ได้อย่างไรเพื่อที่รหัสผ่านจะไม่หมดอายุ
Jay Imerman

14
select username,expiry_date,account_status from dba_users; เพื่อดู account_status สำหรับบัญชีที่หมดอายุคุณอาจต้องรีเซ็ตรหัสผ่านหนึ่งครั้งเป็นครั้งสุดท้าย
Will Wu

6
แก้ไขการปลดล็อกบัญชีผู้ใช้ aaa;
Kalpesh Soni

1
ALTER USER Bob PROFILE MyNonExpiringProfile;เพื่อความสมบูรณ์ถ้าคุณต้องการที่จะเปลี่ยนให้ผู้ใช้รายอื่น:

ไม่มีแถวที่ถูกเลือกในแบบสอบถาม "เลือกโปรไฟล์จาก DBA_USERS โดยที่ username = '<username>';
gaurav

90

สำหรับการพัฒนาคุณสามารถปิดการใช้งานนโยบายรหัสผ่านได้หากไม่มีการตั้งค่าโปรไฟล์อื่น (เช่นปิดใช้งานการหมดอายุของรหัสผ่านเป็นค่าเริ่มต้น):

ALTER PROFILE "DEFAULT" LIMIT PASSWORD_VERIFY_FUNCTION NULL;

จากนั้นรีเซ็ตรหัสผ่านและปลดล็อกบัญชีผู้ใช้ มันไม่ควรหมดอายุอีกครั้ง:

alter user user_name identified by new_password account unlock;

40

ในฐานะที่เป็นคำตอบอื่น ๆ การเปลี่ยนโปรไฟล์ของผู้ใช้ (เช่นโปรไฟล์ 'DEFAULT') อย่างเหมาะสมจะนำไปสู่รหัสผ่านที่ตั้งไว้ครั้งเดียวจะไม่มีวันหมดอายุ

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

วิธีแก้ปัญหาสำหรับรหัสผ่านที่หมดอายุด้วยบัญชีที่ถูกล็อค (ตามที่ระบุไว้ในความคิดเห็นการตอบรับ) คือการใช้คำสั่ง ALTER USER หนึ่งเวอร์ชัน:

ALTER USER xyz_user ACCOUNT UNLOCK;

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

ALTER USER xyz_user IDENTIFIED BY new_password;

ด้านล่างเป็นสคริปต์ SQL * Plus เล็กน้อยที่ผู้ใช้ที่ได้รับสิทธิพิเศษ (เช่นผู้ใช้ 'SYS') สามารถใช้เพื่อรีเซ็ตรหัสผ่านของผู้ใช้เป็นค่าแฮชปัจจุบันที่เก็บอยู่ในฐานข้อมูล

แก้ไข: Oracle รุ่นเก่าเก็บรหัสผ่านหรือรหัสผ่านแฮในคอลัมน์ pword, Oracle รุ่นใหม่กว่าเก็บรหัสผ่านแฮในคอลัมน์ว่าง 4 สคริปต์ด้านล่างมีการเปลี่ยนแปลงเพื่อรวบรวมคอลัมน์ pword และ spare4 แต่เพื่อใช้คอลัมน์ spare4 เพื่อรีเซ็ตบัญชีของผู้ใช้ แก้ไขตามต้องการ

REM Tell SQL*Plus to show before and after versions of variable substitutions.
SET VERIFY ON
SHOW VERIFY

REM Tell SQL*Plus to use the ampersand '&' to indicate variables in substitution/expansion.
SET DEFINE '&'
SHOW DEFINE

REM Specify in a SQL*Plus variable the account to 'reset'.
REM Note that user names are case sensitive in recent versions of Oracle.
REM DEFINE USER_NAME = 'xyz_user'

REM Show the status of the account before reset.
SELECT
  ACCOUNT_STATUS,
  TO_CHAR(LOCK_DATE, 'YYYY-MM-DD HH24:MI:SS') AS LOCK_DATE,
  TO_CHAR(EXPIRY_DATE, 'YYYY-MM-DD HH24:MI:SS') AS EXPIRY_DATE
FROM
  DBA_USERS
WHERE
  USERNAME = '&USER_NAME';

REM Create SQL*Plus variable to hold the existing values of the password and spare4 columns.
DEFINE OLD_SPARE4 = ""
DEFINE OLD_PASSWORD = ""

REM Tell SQL*Plus where to store the values to be selected with SQL.
REM Note that the password hash value is stored in spare4 column in recent versions of Oracle,
REM   and in the password column in older versions of Oracle.
COLUMN SPARE4HASH NEW_VALUE OLD_SPARE4
COLUMN PWORDHASH NEW_VALUE OLD_PASSWORD

REM Select the old spare4 and password columns as delimited strings 
SELECT 
  '''' || SPARE4 || '''' AS SPARE4HASH,
  '''' || PASSWORD || '''' AS PWORDHASH
FROM 
  SYS.USER$ 
WHERE 
  NAME = '&USER_NAME';

REM Show the contents of the SQL*Plus variables
DEFINE OLD_SPARE4
DEFINE OLD_PASSWORD

REM Reset the password - Older versions of Oracle (e.g. Oracle 10g and older) 
REM ALTER USER &USER_NAME IDENTIFIED BY VALUES &OLD_PASSWORD;

REM Reset the password - Newer versions of Oracle (e.g. Oracle 11g and newer) 
ALTER USER &USER_NAME IDENTIFIED BY VALUES &OLD_SPARE4;

REM Show the status of the account after reset
SELECT
  ACCOUNT_STATUS,
  TO_CHAR(LOCK_DATE, 'YYYY-MM-DD HH24:MI:SS') AS LOCK_DATE,
  TO_CHAR(EXPIRY_DATE, 'YYYY-MM-DD HH24:MI:SS') AS EXPIRY_DATE
FROM
  DBA_USERS
WHERE
  USERNAME = '&USER_NAME';

2
ขอบคุณสำหรับความช่วยเหลือ มันยากที่จะหาคำตอบที่เกี่ยวข้อง คำตอบอื่น ๆ หมายถึง PASSWORD_LIFE_TIME เท่านั้น
sabertiger

คอลัมน์ SYS.USER $. รหัสผ่านจะมีเฉพาะแฮชของรหัสผ่านเวอร์ชันที่ไม่ใช่ตัวพิมพ์เล็ก / ใหญ่ (ตัวพิมพ์ใหญ่?) ใน Oracle 11 เว้นแต่คุณจะตั้งค่าพารามิเตอร์ระบบ SEC_CASE_SENSITIVE_LOGON = FALSE จะมีแฮชที่ยาวกว่าของรหัสผ่านขนาดตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ในคอลัมน์ SYS.USER $ .SPARE4
Morbo

16

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


7
ฉันคิดว่าในการติดตั้งใหม่ 11g (เมื่อเทียบกับการอัพเกรด) กับการรักษาความปลอดภัยที่ดีขึ้นแนะนำรหัสผ่านจะเริ่มต้นที่จะหมดอายุหลังจาก 30 วัน
Gary Myers


0

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

อย่างไรก็ตามถ้าคุณต้องการ

หากคุณมีการเข้าถึงที่เหมาะสมให้ใช้ SQL ต่อไปนี้

เลือกชื่อผู้ใช้ account_status จาก dba_users;

นี่ควรให้ผลลัพธ์แบบนี้กับคุณ

   USERNAME                       ACCOUNT_STATUS
------------------------------ -----------------

SYSTEM                         OPEN
SYS                            OPEN
SDMADM                         OPEN
MARKETPLACE                    OPEN
SCHEMAOWNER                    OPEN
ANONYMOUS                      OPEN
SCHEMAOWNER2                   OPEN
SDMADM2                        OPEN
SCHEMAOWNER1                   OPEN
SDMADM1                        OPEN
HR                             EXPIRED(GRACE)

USERNAME                       ACCOUNT_STATUS
------------------------------ -----------------

APEX_PUBLIC_USER               LOCKED
APEX_040000                    LOCKED
FLOWS_FILES                    LOCKED
XS$NULL                        EXPIRED & LOCKED
OUTLN                          EXPIRED & LOCKED
XDB                            EXPIRED & LOCKED
CTXSYS                         EXPIRED & LOCKED
MDSYS                          EXPIRED & LOCKED

ตอนนี้คุณสามารถใช้ Pedro Carriçoได้คำตอบhttps://stackoverflow.com/a/6777079/2432468


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