Olá pessoal, tudo bom? Espero que sim!
Aqui na nossa empresa não utilizamos a integração da suíte Atlassian com o AD, então o processo de gestão de acesso dos usuários costumava gerar um overload operacional bem alto.
Este ano - muito graças à pandemia - tivemos um aumento substancial de usuários em nossas ferramentas, e a automação da criação/desativação/reativação e inclusão em grupos tornou-se extremamente necessária.
Desenvolvi diversos scripts recentemente, e hoje trouxe pra vocês um dos mais simples de ser configurado: A desativação automatizada de usuários via REST API.
Vamos começar?
OS ARQUIVOS
Tenho 2 recomendações sobre o local dos arquivos:
Caso opte por deixá-los em outros locais, prepare-se para resolver alguns problemas de permissionamento.
Arquivo query.sql:
Esta query coleta uma lista com o nome de usuário dos usuários que estão a X dias sem acesso e foram criados/reativados há mais de Y dias.
set pagesize 999
set heading off
set echo off
set feedback off
set verify off
SELECT "USER_NAME" FROM
(SELECT "USER_NAME","ACTIVE","CREATED_DATE","UPDATED_DATE",NVL(B.LOGIN_COUNT,0)
AS LOGIN_COUNT, TO_CHAR(C.LAST_LOGIN,'DD/MM/YYYY') AS LAST_LOGIN,
ROUND(CURRENT_DATE - LAST_LOGIN,0) AS LASTLOGINCOUNT,
ROUND(CURRENT_DATE - UPDATED_DATE,0) AS UPDATEDCOUNT,
ROUND(CURRENT_DATE - CREATED_DATE,0) AS COUNTCREATION FROM "CWD_USER" A
LEFT JOIN
(SELECT "USER_ID","ATTRIBUTE_NAME","ATTRIBUTE_VALUE" AS LOGIN_COUNT FROM "CWD_USER_ATTRIBUTES" WHERE ATTRIBUTE_NAME = 'login.count') B
ON A.ID = B.USER_ID
LEFT JOIN
(SELECT "USER_ID","ATTRIBUTE_NAME", TO_DATE('01.01.1970','dd.mm.yyyy') + TO_NUMBER("ATTRIBUTE_VALUE")/1000/60/60/24 AS LAST_LOGIN FROM "CWD_USER_ATTRIBUTES" WHERE ATTRIBUTE_NAME = 'lastAuthenticated') C
ON A.ID = C.USER_ID)
WHERE "ACTIVE"=1
AND (("LASTLOGINCOUNT" IS NULL AND ("COUNTCREATION">$dias_desde_a_criação AND "UPDATEDCOUNT">$dias_desde_a reativação)) OR "LASTLOGINCOUNT">$dias_desde_ultimo_login AND "UPDATEDCOUNT">$dias_desde_a reativação)
ORDER BY USER_NAME;
exit
Variáveis para customização:
Arquivo script.sh:
Este script lê a lista coletada acima e acessa as APIs do jira para desativá-los. As entradas de log são opcionais. Por favor tome nota do comentário inserido antes do comando "tail -n +18 users_1.csv > users_2.csv", já que a não adaptação desta linha pode fazer com que a coleta de usuários não seja bem sucedida.
#!/bin/bash
# Salvando o diretório de execução do script.
EXEC_PATH=$PWD
# Fazendo login com o usuário do oracle e rodando a query de coleta dos usuários.
sudo su - oracle -c "sqlplus -s $usuario_do_BD_do_jira/$senha_do_usuario_do_BD_do_jira @$EXEC_PATH/querr.sql" > users_1.csv
# O comando acima faz o login com o usuário do oracle e recarrega as
# variáveis de ambiente, temos um banner de login que - no meu caso -
# ocupa 18 linhas. Ao rodar na primeira vez, comente todas as linhas
# abaixo deste comentário e cheque o arquivo users_1.csv para verificar
# se você precisará remover alguma linha do cabeçalho, se sim substitua
# o 18 no comando abaixo pela quantidade de linhas que deverão ser
# removidas do arquivo.
tail -n +18 users_1.csv > users_2.csv
# Coletando dia e hora para log.
function getdate() {date +"%F %T"}
# Entradas de execução para log.
echo "########################################################################"
echo "$(getdate) Inicio da execução do script de clean-up de usuários"
# Leitura do arquivo com os usuários e execução.
while IFS="," read user_name
do
echo -e "Desativando usuario: $user_name..."
curl -s -X PUT $url_do_jira/rest/api/2/user?username=${user_name} \
-u $usuario_administrativo_do_jira:$senha_do_usuario_administrativo_do_jira \
-H 'Content-Type: application/json; charset=utf-8' \
--data '{"active": "false"}'
sleep 2
done < users_2.csv
# Deleção de arquivos criados
rm -f *.csv
# Entradas de execução para log.
echo "$(getdate) Término da execução do script de clean-up de usuários"
Variáveis para customização:
PERMISSÕES
Caso opte por deixar o usuário/senha hardcoded no script, recomendo ajustar as permissões dos arquivos conforme abaixo:
-r-x------ 1 oracle oinstall 1027 Aug 24 11:52 query.sql
-r-x------ 1 root root 341 Aug 24 11:56 script.sh
Desta forma os únicos com acesso para execução e leitura são os owners/grupos dos arquivos:
chmod 500 query.sql
chmod 500 script.sh
Note também que alterei o owner/grupo do arquivo query.sql:
chown oracle query.sql
chgrp oinstall query.sql
Fiz isto pois por padrão só é possível agendar tarefas no crontab do root, portanto o script será executado com o usuário do root.
No entanto precisaremos fazer login dentro do script com o usuário do oracle, e ele não conseguirá acessar o arquivo caso não seja o owner.
AGENDAMENTO
Para configurar a execução diária deste script, basta incluir uma linha no cron do servidor:
crontab -e
O formato de agendamento do crontab pode variar dependendo do tipo e versão do seu SO, mas aqui no nosso servidor, configuramos desta forma: execução diária às 06 da manhã, com output salvo no arquivo de log logdoscript.log, salvo no mesmo diretório dos scripts.
00 06 * * * $diretorio_do_script/script.sh >> $diretorio_do_script/logdoscript.log
Variáveis para customização:
Fui aprendendo algumas coisas na tentativa e erro ao longo de tempo e apanhei bastante pra descobrir alguns pontos descritos aqui em cima, então espero ter coberto a maioria das dúvidas/problemas que vocês possam ter.
Disclaimer: não sou nem tenho experiência com a área de Desenvolvimento, então provavelmente existe espaço pra melhoria no código e na documentação do código. Sugestões serão sempre bem vindas. =)
Solved! Go to Solution.
Ahhhh! Não sei porque, mas eu não tinha visto esse comentário! Obrigada Dai!. =)
Fantástico @Julia Nunes Pedrosa !