Como desativo a expiração da senha do Oracle?


177

Estou usando o Oracle para desenvolvimento. A senha de uma conta de autoinicialização que eu sempre uso para reconstruir meu banco de dados expirou.

Como desativo a expiração de senha deste usuário (e de todos os outros usuários) permanentemente?

Estou usando o Oracle 11g, que possui senhas que expiram por padrão.


Eu acho que você pode estar melhor perguntando isso no serverfault.com. Não vou forçá-lo porque você disse que o está usando para desenvolvimento, e acho que ainda há uma chance de alguém aqui saber e / ou outros aqui poderem se beneficiar dessas informações.
Bill o lagarto

Eu acho que vou fazer exatamente isso. Eu estava debatendo para qual site era mais apropriado, já que é uma pergunta básica do banco de dados e não tanto uma coisa de DBA.
21139 Josh Kodroff

Não sei o que a política dupe é para perguntas cross-site, mas aqui está o link: serverfault.com/questions/37622/...
Josh Kodroff

Respostas:


313

Para alterar a política de expiração de senha para um determinado perfil de usuário no Oracle, verifique primeiro qual perfil o usuário está usando:

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

Em seguida, você pode alterar o limite para nunca expirar usando:

alter profile <profile_name> limit password_life_time UNLIMITED;

Se você deseja verificar previamente o limite, pode usar:

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

5
Isso alterou o perfil. No entanto, tenho usuários cujas senhas estão definidas para expirar porque o perfil padrão o tinha como tal quando elas foram criadas. Como altero essas contas de usuário para que a senha não expire?
Jay Imerman

14
select username,expiry_date,account_status from dba_users; para visualizar o account_status. para as contas que expiram, pode ser necessário redefinir a senha uma vez pela última vez.
Will Wu

6
alterar o desbloqueio da conta do usuário aaa;
Kalpesh Soni

1
Para completar, se você precisar alterar um usuário para outro perfil: ALTER USER Bob PROFILE MyNonExpiringProfile;.

nenhuma linha selecionada na consulta "selecione perfil de DBA_USERS em que nome de usuário = '<nome de usuário>';"
gaurav

90

Para desenvolvimento, você pode desativar a política de senha se nenhum outro perfil foi definido (por exemplo, desativar a expiração da senha no padrão):

ALTER PROFILE "DEFAULT" LIMIT PASSWORD_VERIFY_FUNCTION NULL;

Em seguida, redefina a senha e desbloqueie a conta do usuário. Nunca deve expirar novamente:

alter user user_name identified by new_password account unlock;

40

Como as outras respostas afirmam, alterar o perfil do usuário (por exemplo, o perfil 'PADRÃO') adequadamente levará a senhas que, uma vez definidas, nunca expirarão.

No entanto, como um comentarista ressalta, as senhas definidas com os valores antigos do perfil já podem ter expirado e (se após o período de carência especificado no perfil) a conta foi bloqueada.

A solução para senhas expiradas com contas bloqueadas (conforme fornecido em um comentário de resposta) é usar uma versão do comando ALTER USER:

ALTER USER xyz_user ACCOUNT UNLOCK;

No entanto, o comando unlock funciona apenas para contas em que a conta está realmente bloqueada, mas não para as contas que estão no período de cortesia, ou seja, onde a senha expirou, mas a conta ainda não está bloqueada. Para essas contas, a senha deve ser redefinida com outra versão do comando ALTER USER:

ALTER USER xyz_user IDENTIFIED BY new_password;

Abaixo está um pequeno script SQL * Plus que um usuário privilegiado (por exemplo, usuário 'SYS') pode usar para redefinir a senha de um usuário para o valor atual atual do hash armazenado no banco de dados.

EDIT: As versões mais antigas do Oracle armazenam a senha ou o hash da senha na coluna pword, as versões mais recentes do Oracle armazenam o hash da senha na coluna spare4. O script abaixo foi alterado para coletar as colunas pword e spare4, mas para usar a coluna spare4 para redefinir a conta do usuário; modifique conforme necessário.

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
Obrigado pela ajuda. É tão difícil encontrar uma resposta relevante. Todas as outras respostas se referem apenas a PASSWORD_LIFE_TIME.
Sabertiger 24/05

A coluna SYS.USER $ .PASSWORD conterá apenas o hash da versão sem distinção entre maiúsculas e minúsculas (maiúsculas?) Da senha. No Oracle 11, a menos que você defina o parâmetro do sistema SEC_CASE_SENSITIVE_LOGON = FALSE, haverá um hash muito mais longo da senha com distinção entre maiúsculas e minúsculas na coluna SYS.USER $ .SPARE4.
Morbo

16

Eu acredito que o comportamento de expiração da senha, por padrão, nunca deve expirar. No entanto, você pode configurar um perfil para o seu usuário de desenvolvimento definido e definir o PASSWORD_LIFE_TIME. Veja o orafaq para mais detalhes. Você pode ver aqui um exemplo da perspectiva e uso de uma pessoa.


7
Eu acho que em uma nova instalação 11g (em oposição a uma atualização) com a segurança aprimorada recomendada, as senhas terão o padrão para expirar após 30 dias.
9789 Gary Myers


0

Sugiro que não seja uma boa idéia desativar a expiração da senha, pois isso pode levar a possíveis ameaças à confidencialidade, integridade e disponibilidade dos dados.

No entanto, se você quiser.

Se você tiver acesso adequado, use o comando SQL

SELECT nome de usuário, account_status FROM dba_users;

Isso deve lhe dar um resultado assim.

   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

Agora você pode usar a resposta de Pedro Carriço https://stackoverflow.com/a/6777079/2432468


Embora eu concorde que seja imprudente desativar a expiração de senha nos ambientes de produção, podemos desativá-la em Desenvolvimento ou Teste.
APC
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.