Bagaimana cara mematikan kedaluwarsa kata sandi Oracle?

177

Saya menggunakan Oracle untuk pengembangan. Kata sandi untuk akun bootstrap yang selalu saya gunakan untuk membangun kembali basis data saya telah kedaluwarsa.

Bagaimana cara mematikan kedaluwarsa kata sandi untuk pengguna ini (dan semua pengguna lain) secara permanen?

Saya menggunakan Oracle 11g, yang kata sandinya habis secara default.

Josh Kodroff
sumber
Saya pikir Anda mungkin lebih baik menanyakan ini di serverfault.com. Saya tidak akan memaksanya karena Anda mengatakan Anda menggunakannya untuk pengembangan, dan saya pikir masih ada kemungkinan seseorang di sini akan tahu dan / atau orang lain di sini mungkin mendapat manfaat dari informasi ini.
Bill the Lizard
Saya pikir saya akan melakukan hal itu. Saya berdebat dengan situs mana yang lebih tepat, karena ini adalah pertanyaan basis data dasar dan bukan masalah DBA.
Josh Kodroff
Tidak yakin apa kebijakan korban penipuan adalah untuk pertanyaan cross-site, tapi di sini link: serverfault.com/questions/37622/...
Josh Kodroff

Jawaban:

313

Untuk mengubah kebijakan kadaluwarsa kata sandi untuk profil pengguna tertentu di Oracle, periksa dulu profil mana yang digunakan pengguna:

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

Kemudian Anda dapat mengubah batas untuk tidak pernah kedaluwarsa menggunakan:

alter profile <profile_name> limit password_life_time UNLIMITED;

Jika Anda ingin memeriksa batas sebelumnya, Anda dapat menggunakan:

select resource_name,limit from dba_profiles where profile='<profile_name>';
Pedro Carriço
sumber
5
Ini mengubah profil. Namun, saya memiliki pengguna yang kata sandinya diatur untuk kedaluwarsa karena profil default memilikinya ketika dibuat. Bagaimana cara mengubah akun pengguna ini sehingga kata sandi tidak kedaluwarsa?
Jay Imerman
14
select username,expiry_date,account_status from dba_users; untuk melihat status akun. untuk akun yang kedaluwarsa, Anda mungkin perlu mengatur ulang kata sandi sekali untuk yang terakhir kalinya.
Will Wu
6
ubah buka kunci akun pengguna aaa;
Kalpesh Soni
1
Untuk kelengkapan, jika Anda perlu untuk mengubah pengguna ke profil lain: ALTER USER Bob PROFILE MyNonExpiringProfile;.
tidak ada baris yang dipilih pada kueri "pilih profil dari DBA_USERS di mana nama pengguna = '<username>';"
gaurav
90

Untuk pengembangan, Anda dapat menonaktifkan kebijakan kata sandi jika tidak ada profil lain yang ditetapkan (mis. Menonaktifkan kata sandi kedaluwarsa pada profil default):

ALTER PROFILE "DEFAULT" LIMIT PASSWORD_VERIFY_FUNCTION NULL;

Kemudian, setel ulang kata sandi dan buka kunci akun pengguna. Seharusnya tidak pernah kedaluwarsa lagi:

alter user user_name identified by new_password account unlock;
Shimon
sumber
40

Seperti yang dinyatakan oleh jawaban lainnya, mengubah profil pengguna (misalnya profil 'DEFAULT') dengan tepat akan menghasilkan kata sandi, yang setelah ditetapkan, tidak akan pernah kedaluwarsa.

Namun, seperti yang ditunjukkan oleh satu komentator, kata sandi yang ditetapkan di bawah nilai-nilai lama profil mungkin sudah kedaluwarsa, dan (jika setelah masa tenggang yang ditentukan profil) akun terkunci.

Solusi untuk kata sandi yang kedaluwarsa dengan akun yang dikunci (seperti yang disediakan dalam komentar penjawab) adalah dengan menggunakan satu versi perintah ALTER USER:

ALTER USER xyz_user ACCOUNT UNLOCK;

Namun perintah buka kunci hanya berfungsi untuk akun yang akunnya benar-benar dikunci, tetapi tidak untuk akun yang berada dalam masa tenggang, yaitu saat kata sandi habis masa berlakunya tetapi akun tersebut belum dikunci. Untuk akun ini kata sandi harus disetel ulang dengan versi lain dari perintah ALTER USER:

ALTER USER xyz_user IDENTIFIED BY new_password;

Di bawah ini adalah skrip SQL * Plus kecil yang dapat digunakan pengguna istimewa (misalnya pengguna 'SYS') untuk mengatur ulang kata sandi pengguna ke nilai hash yang ada saat ini yang disimpan dalam database.

EDIT: Oracle versi lama menyimpan kata sandi atau hash kata sandi di kolom pword, versi Oracle yang lebih baru menyimpan hash kata sandi di kolom spare4. Script di bawah ini diubah untuk mengumpulkan kolom pword dan spare4, tetapi menggunakan kolom spare4 untuk mereset akun pengguna; modifikasi sesuai kebutuhan.

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';
Kieron Hardy
sumber
2
Terima kasih untuk bantuannya. Sangat sulit untuk menemukan jawaban yang relevan. Setiap jawaban lainnya hanya merujuk ke PASSWORD_LIFE_TIME.
sabertiger
Kolom SYS.USER $ .PASSWORD hanya akan berisi hash dari kata sandi versi NON-case-sensitive (huruf besar?). Di Oracle 11, kecuali jika Anda menetapkan parameter sistem SEC_CASE_SENSITIVE_LOGON = FALSE akan ada hash yang jauh lebih lama dari kata sandi peka huruf besar-kecil di kolom SYS.USER $ .SPARE4.
Morbo
16

Saya percaya bahwa perilaku kedaluwarsa kata sandi, secara default, tidak pernah kedaluwarsa. Namun, Anda dapat mengatur profil untuk set pengguna dev Anda dan mengatur PASSWORD_LIFE_TIME. Lihat orafaq untuk detail lebih lanjut. Anda dapat melihat di sini untuk contoh perspektif dan penggunaan satu orang.

akf
sumber
7
Saya pikir dalam instalasi 11g baru (sebagai lawan dari upgrade) dengan keamanan yang disarankan ditingkatkan, kata sandi akan secara default berakhir setelah 30 hari.
Gary Myers
1
Pada 11g sekarang 180 hari: docs.oracle.com/cd/E38689_01/pt853pbr0/eng/pt/tadm/…
Nicolas Mommaerts
0

Saya akan menyarankan itu bukan ide yang baik untuk mematikan kedaluwarsa kata sandi karena dapat menyebabkan kemungkinan ancaman terhadap kerahasiaan, integritas dan ketersediaan data.

Namun jika Anda menginginkannya.

Jika Anda memiliki akses yang tepat, gunakan SQL berikut ini

SELECT nama pengguna, account_status DARI dba_users;

Ini akan memberi Anda hasil seperti ini.

   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

Sekarang Anda dapat menggunakan Pedro Carriço jawab https://stackoverflow.com/a/6777079/2432468

Pawan Kumar
sumber
Sementara saya setuju itu terburu-buru untuk menonaktifkan kedaluwarsa kata sandi di lingkungan Produksi kami mungkin ingin mematikannya dalam Pengembangan atau Pengujian.
APC