Create
cancel
Showing results for 
Search instead for 
Did you mean: 
Sign up Log in

Desativação Automatizada de Usuários | Gestão de Licenças com API

Julia Nunes Pedrosa August 24, 2020

Olá pessoal, tudo bom? Espero que sim!

giphy.gif?cid=ecf05e4796sngkt20acrq1waboh51rpxcxr8vv0aukycv1a8&rid=giphy

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.

  • Por que? Tivemos um problema antes de aumentarmos a nossa licença com a questão da limitação de usuários, já que o processo de coleta/desativação de usuários inativos por x dias não havia amadurecido o suficiente para ser utilizado com a frequência que estava sendo utilizada (quase diariamente).
  • Pré-requisitos técnicos: 
    • Acesso administrativo à aplicação do Jira (para acesso às API's de gerenciamento de usuários);
    • Acesso administrativo ao servidor de Banco de Dados do JIRA;
    • BD deve estar hospedado em um servidor Linux.
  • Limitações: Não sei como funciona a parte de gestão de acessos no Jira Cloud, então não sei dizer como replicar o script nem se ele funciona para a Cloud. Sorry. =(
  • Versão do Jira: Jira v8.5.1
  • Versão do SQLPlus: Release 12.1.0.2.0 Production

Vamos começar?

giphy

 

OS ARQUIVOS

Tenho 2 recomendações sobre o local dos arquivos: 

  • Preferível que estejam no mesmo diretório;
  • Preferível que fiquem em /home/oracle.

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:

  • dias_desde_a_criação: Espaço de dias que o usuário pode ficar sem acessar desde que o usuário é criado - para evitar a desativação de usuários que ainda não tiveram tempo de acessar desde a solicitação de acesso, nós deixamos 10 por aqui;
  • dias_desde_a_reativação: A mesma coisa que o bullet acima, mas referente a reativação do usuário, nós deixamos 10 por aqui;
  • dias_desde_ultimo_login: Dias sem acesso para que o usuário seja desativado, nós deixamos 40 por aqui - para evitar desativar usuários que estão de férias.

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:

  • usuario_do_BD_do_jira: nome auto-explicativo;
  • senha_do_usuario_do_BD_do_jira: nome auto-explicativo;
  • url_do_jira:nome auto-explicativo;
  • usuario_administrativo_do_jiranome auto-explicativo;
  • senha_do_usuario_administrativo_do_jiranome auto-explicativo;

 

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:

  • diretorio_do_script: nome auto-explicativo;

giphy

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. =)

2 comments

Comment

Log in or Sign up to comment
Conte Daiane August 24, 2020

Muito obrigada @Julia Nunes Pedrosa por compartilhar com todos nós o seu desafio de forma tão rica e detalhada!

Parabéns você mandou super bem!!!

Like # people like this
Julia Nunes Pedrosa May 20, 2021

Ahhhh! Não sei porque, mas eu não tinha visto esse comentário! Obrigada Dai!. =)

Like Pedro Silva likes this
Pedro Silva May 20, 2021

Fantástico @Julia Nunes Pedrosa !

Like Julia Nunes Pedrosa likes this
Julia Nunes Pedrosa May 20, 2021

Obrigada Pedro! =)

Like Pedro Silva likes this
TAGS
AUG Leaders

Atlassian Community Events