Todos os posts de avsilva

VMware PowerCLI no Red Hat 7

Quem usa VMware e está acostumado a usar o PowerCLI mas sempre achou ruim o fato de ser uma ferramenta que só funciona no Windows, essa semana tivemos uma boa noticia: foi disponibilizado como um Vmware Fling o PowerCLI para Linux e Mac OS, o projeto se aproveita do lançamento do powershell core e .net core que a Microsoft lançou esse ano para outras plataformas. Fiz os testes no Redhat e funcionou legal, tive alguns problemas de performance com alguns comandos do PowerCLI, mas a possibilidade de rodar os scripts em Linux já me animou e com certeza usarei. Lembrando que o powershell para Linux ainda não é a versão final, então usem em produção por sua conta e risco 😛
Links:
PowerCli: https://labs.vmware.com/flings/powercli-core
Powershell: https://github.com/PowerShell/PowerShell/releases/

Vou mostrar aqui como instalei no RedHat 7, para instalação no Ubuntu e outros baseados em Debian verifique o pdf de instruções disponíveis no link logo acima. Para instalação via docker segue o link: https://hub.docker.com/r/vmware/powerclicore/ .

O primeiro problema que tive foi na hora de tentar conectar ao Vpshere pelo PowerCli e vi que a versão do libcurl do Redhat tinha algum problema com a conexão ssl, então vamos ver as dependências antes de instalar o que queremos. Usei os seguintes pacotes: libcurl-openssl-7.43.0-1.1.el7 e libcurl-openssl-devel-7.43.0-1.1.el7 , vamos baixa-los:

[root@localhost ~]# wget http://ftp.riken.jp/Linux/cern/centos/7/cern/x86_64/Packages/libcurl-openssl-7.43.0-1.1.el7.cern.x86_64.rpm
[root@localhost ~]# wget http://ftp.riken.jp/Linux/cern/centos/7/cern/x86_64/Packages/libcurl-openssl-devel-7.43.0-1.1.el7.cern.x86_64.rpm

Após baixar, instale os pacotes:

[root@localhost ~]# yum install libcurl-openssl-7.43.0-1.1.el7.cern.x86_64.rpm
[root@localhost ~]# yum install libcurl-openssl-devel-7.43.0-1.1.el7.cern.x86_64.rpm

Normalmente instalará as libs na pasta /opt/shibboleth/lib64/, adicionei a pasta ao $LD_LIBRARY_PATH:

[root@localhost ~]# export LD_LIBRARY_PATH=/opt/shibboleth/lib64/:$LD_LIBRARY_PATH

Agora baixe o PowerCLI_Core.zip aqui: https://labs.vmware.com/flings/powercli-core
e depois baixe a ultima versão do powershell para linux:

[root@localhost ~]# wget https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-alpha.11/powershell-6.0.0_alpha.11-1.el7.centos.x86_64.rpm

Instale:

[root@localhost ~]# yum install powershell-6.0.0_alpha.11-1.el7.centos.x86_64.rpm

Descompacte o PowerCLI_Core.zip, ele deve conter dois arquivos que usaremos: PowerCLI.Vds.4523941.zip e PowerCLI.ViCore.4523941.zip:

[root@localhost ~]# unzip PowerCLI_Core.zip

Vamos para a pasta dos módulos do powershell, se ela não existir será necessário criar, e vamos descompactar os dois arquivos de antes nela:

[root@localhost ~]# cd /root/.local/share/powershell/Modules
[root@localhost ~]# unzip ~/PowerCLI.Vds.4523941.zip
[root@localhost ~]# unzip ~/PowerCLI.ViCore.4523941.zip

Agora já deveremos ter acesso aos comandos do powerCLI, primeiro importe o modulo e então é só começar a brincar. Usei o set-powercliconfiguration para ignorar o erro de certificado não confiável , como informado pelo próprio faq do PowerCLI, como estou apenas testando não tive problema com isso.

[root@localhost ~]# powershell
PowerShell
Copyright (C) 2016 Microsoft Corporation. All rights reserved.
PS /root> Get-Module -ListAvailable PowerCLI* | Import-Module
PS /root> set-powercliconfiguration -InvalidCertificateAction Ignore
PS /root> Connect-VIServer -server vsphereserver -User usuario@vsphere.local -Password senha
PS /root> Get-VM

Você também pode rodar os scripts powershell sem precisar abrir o console, que é o queremos não é?, usando o comando: powershell -File nomedoscript.ps1

Fiz um teste com um pequeno script para mostrar os snapshots :

[root@localhost ~]# vim teste.ps1
Get-Module -ListAvailable PowerCLI* | Import-Module
Connect-VIServer -server nomedoservidorvsphere -User usuario@vsphere.local -Password senha
get-vm | get-snapshot | format-list vm,name,description

Agora só executar direto do shell:

[root@localhost ~]# powershell -File teste.ps1

Referências:
https://labs.vmware.com/flings/powercli-core
https://github.com/PowerShell/PowerShell/releases/
http://ftp.riken.jp/Linux/cern/centos/7/cern/x86_64/repoview/letter_l.group.html
https://hub.docker.com/r/vmware/powerclicore/
https://labs.vmware.com/flings/about

PowerCLI Core is now available on Docker Hub!

Apresentando o audit2allow para configurar politicas no SELINUX

O SELINUX é ignorado por muitos, o padrão de muito usuário e até administradores é desabilita-lo logo após instalarem o linux. Eu já fiz muito isso. Mas agora entendo que é uma ferramenta essencial para segurança do sistema e tenho a estudado melhor.
Muitas vezes ele é desabilitado porque acaba bloqueando algum serviço que precisamos. Irei mostrar aqui o audit2allow para uma simples configuração do SELINUX sem precisar desabilita-lo. No exemplo estou usando o Red Hat 7.1.

A primeira coisa é que seu SELINUX não esteja desativado. Ele tem dois modos de operação o permissive e o enforcing, o primeiro irá apenas alertar o que é negado pelas políticas e irá por padrão salvar os logs no arquivo /var/log/audit/audit.log com a tag AVC, o segundo é onde ele vai realmente aplicar as políticas e negar o que tiver que ser negado. O modo permissive é bom para troubleshooting.
Segue abaixo o arquivo de configuração, o parâmetro a ser modificado para esses modos é o SELINUX :

[root@server ~]# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing – SELinux security policy is enforced.
#     permissive – SELinux prints warnings instead of enforcing.
#     disabled – No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three two values:
#     targeted – Targeted processes are protected,
#     minimum – Modification of targeted policy. Only selected processes are protected.
#     mls – Multi Level Security protection.
SELINUXTYPE=targeted

Se no seu caso ele tiver desabilitado você deve reiniciar o sistema depois de modificar o arquivo. para visualizar o modo ativo pode usar o comando getenforce e para trocar o modo use setenforce 0 ou setenforce 1 (0 – permissive, 1 – enforcing).

Uma dependência no RedHat é o pacote policycoreutils-python:

[root@server ~]# yum install policycoreutils-python

Vou procurar no audit.log o que está sendo negado pelo SELINUX, usei o grep -A 1 para pegar também a mensagem de SYSCALL relativo ao acesso:

[root@server ~]# cat /var/log/audit/audit.log | grep denied -A 1
type=AVC msg=audit(1475563381.130:444590): avc:  denied  { write } for  pid=12513 comm=”logrotate” name=”www-error.log” dev=”dm-1″ ino=67955370 scontext=system_u:system_r:logrotate_t:s0-s0:c0.c1023 tcontext=system_u:object_r:usr_t:s0 tclass=file
type=SYSCALL msg=audit(1475563381.130:444590): arch=c000003e syscall=2 success=no exit=-13 a0=2467650 a1=20002 a2=246e880 a3=7ffe8e234120 items=0 ppid=12511 pid=12513 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=21381 comm=”logrotate” exe=”/usr/sbin/logrotate” subj=system_u:system_r:logrotate_t:s0-s0:c0.c1023 key=(null)

O que é importante verificar nos logs:
{ write } : Aqui é a permissão que está sendo negada, no meu caso foi a de escrita.
comm=”logrotate” : o executável que chamou o processo.
name=”www-error.log” : Aqui pode ser name ou path, é o objeto que o processo está tentando acessar.
scontext=system_u:system_r:logrotate_t:s0-s0:c0.c1023: O contexto do processo.
tcontext=system_u:object_r:usr_t:s0 tclass=file: O contexto do objeto(target).
Na na mensagem do SYSCALL temos o seguinte:
success=no : Indica se o SELINUX negou o acesso(no) ou não(yes), quando estiver em permissive provavelmente estará sempre como yes.
exe=”/usr/sbin/logrotate”: O caminho do executável que iniciou o processo.

Após verificar o log posso usar o audit2allow para verificar melhor o porquê de estar sendo negado:

[root@server ~]# grep logrotate /var/log/audit/audit.log | audit2allow -w -a
type=AVC msg=audit(1475563381.130:444590): avc:  denied  { write } for  pid=12513 comm=”logrotate” name=”www-error.log” dev=”dm-1″ ino=67955370 scontext=system_u:system_r:logrotate_t:s0-s0:c0.c1023 tcontext=system_u:object_r:usr_t:s0 tclass=file
Was caused by:
Unknown – would be allowed by active policy
Possible mismatch between this policy and the one under which the audit message was generated.

Possible mismatch between current in-memory boolean settings vs. permanent ones.

No caso estou usando o grep para pegar apenas casos relativos ao logrotate, você pode fazer isso para algum processo especifico ou para todos. A opção -a significa que ele irá pegar as informações do audit.log e -w nos dá as informações detalhadas com as possíveis causas.

Agora que temos certeza que queremos liberar esse acesso, usaremos o audit2allow para criar um modulo, este modulo criara as políticas necessárias para liberar o acesso que queremos. Vou apresentar aqui dois exemplos. Nesse primeiro comando estamos gerando um modulo para tudo que estiver no audit.log:

[root@server ~]# audit2allow -a -M MyPolicy

o MyPolicy é o nome da seu modulo.

Nesse segundo exemplo estou filtrando por problemas de acesso apenas do logrotate:

[root@server ~]# grep -i logrotate /var/log/audit/audit.log | audit2allow -M MyPolicy

Após executar um dos comandos será criado dois arquivos com o nome do modulo, um .pp e outro .te

[root@server ~]# ls
MyPolicy.pp  MyPolicy.te

Agora é só instalar nosso modulo no SELINUX:

[root@server ~]# semodule -i MyPolicy.pp

E por fim testar seu acesso e verificar que não está mais sendo bloqueado.

Até a próxima!

Referências:

https://wiki.centos.org/HowTos/SELinux
http://danwalsh.livejournal.com/24750.html

Centralizando logs do Apache no Graylog2

Tenho usado o Graylog já tem algum tempo e é uma ótima ferramenta para centralizar os logs de sua infraestrutura. Muitos preferem o ELK ,que também acho uma ótima solução, mas sinceramente preferi a praticidade do Graylog, além do controle de usuários e o Collector que vou abordar nesse post. E pra quem não quer pagar por um Splunk por exemplo, acho uma boa alternativa gratuita.
Me senti na necessidade de escrever esse post, e criar esse blog, porque estava a procura de algum tutorial para capturar os logs do Apache no Graylog e não achei nenhum especifico e atualizado, então decidi reunir as informações que coletei e compartilhar com vocês . Então, vamos lá.

Primeiro suponho que já tenha o Graylog instalado e um servidor web com apache configurado, no exemplo estou usando o seguinte ambiente:

Graylog – Appliance Graylog graylog-2.1.0-1.ova
Web Server – CentOS 7

Usarei o Collector Sidecar para enviar os logs do apache para nosso Graylog, o Sidecar entrou no lugar do Collector antigo e a primeira vantagem, pelo menos para mim, é não precisar do Java. Ele funciona como um intermediário entre uma aplicação de coleta de logs e o Graylog, ele já vem com o Filebeat como ferramenta de coleta mas também pode ser usado com o NXlog. A primeira coisa que faremos é configurar o que queremos coletar no próprio Graylog, é importante fazermos isso antes de instalar o Sidecar porque quando iniciarmos o serviço no web server ele já buscara por essas configurações.

1

Vá em System > Collectors e clique em “Manage Configurations” no canto superior direito.

1-2

Agora crie uma nova configuração com o nome que desejar.

1-3

Após salvar clique no nome dela para editar, vamos agora configurar a tag da nossa configuração, é necessário para que o Sidecar saiba qual configuração usar para aquele host. Após digitar o nome da tag aparecera logo abaixo a opção para adicionar, no nosso caso está “Add “apache”?”, clique na opção e depois “Update tags” e pronto. Importante salientar que o campo é case-sensitive, se na configuração do Sidecar você escrever em maiúsculo ele não irá carregar essa configuração.

2

Em seguida devemos configurar o Output e Input, o primeiro define para onde o Sidecar vai enviar os logs, no caso o seu Graylog, só mexeremos em duas opções o “Name” que é o nome que dará para a configuração e o “Hosts” que é o Graylog e a porta(usaremos a padrão 5044), pode salvar e em seguida configurar o Input. Input é o arquivo ou arquivos de log que ele enviara, no caso só configuraremos um, as opções alteradas são o “Name” e “Path to Logfile”, este ultimo é o caminho do arquivo de log.

3

Agora é preciso criar a input no Graylog para escutar a porta 5044 e receber nossos logs.

6

Já existe uma pré-configuração para o Beats, só selecionar e clicar em “Launch new input”.

7

Só confirme as configurações e salve.

8

Agora estamos prontos para instalar e configurar o Sidecar , execute esses comandos no web server. Primeiro vamos baixar o pacote mais recente:

wget https://github.com/Graylog2/collector-sidecar/releases/download/0.1.0-alpha.1/collector-sidecar-0.1.0-1.x86_64.rpm

instalar …

rpm -ivh collector-sidecar-0.1.0-1.x86_64.rpm

E então editar o arquivo de configuração conforme a imagem:

cd /etc/graylog/collector-sidecar/

vim collector_sidecar.yml

12

Vou ressaltar apenas o que modifiquei para esse exemplo:

server_url: Aqui é a url do Graylog , apenas configurar de acordo com o hostname/ip do seu Graylog.

node_id: A identificação do host no Graylog, é como aparecera na aba Collectors.

tags: Aqui deixei apenas a tag apache que configuramos lá em cima. Se você tiver mais configurações com tags diferentes elas devem estar todas listadas aqui, uma por linha.

Salve o arquivo e agora vamos instalar e iniciar o serviço do Sidecar:

graylog-collector-sidecar -service install

systemctl start collector-sidecar

Nosso web server já deve aparecer no graylog e em pouco tempo os primeiros logs já aparecerão:

14

15

Essa é a configuração básica e com isso já conseguimos centralizar melhor nossos amados logs. Indo um pouco além agora mostrarei uma configuração simples de extractor usando Grok Patterns e depois um Dashboard.

Primeiro vá em “System > Grok Patterns”.

16

Ele já tem algumas configuradas e você pode testa-las no Grokdebug , só colocar lá a pattern e um exemplo da mensagem de log, muito útil. No meu caso usarei uma que funciona com o formato de log do apache que estou usando:

19

LogFormat “%h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”” combined

Então, vamos clicar em “Create Pattern” e entrar com a pattern e um nome para ela:

17

Name: APACHACUSTOMCOMBINED

Pattern: %{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] “(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})” %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent}

18

Após salvar vamos configurar agora o extractor, vamos para a pagina “Search” do Graylog, procure alguma mensagem do web server e clique nela.

20

Vá no campo message e clique na seta no canto direito, selecione “Create extractor for field message” e depois “Grok Pattern”, irá abrir a pagina para criarmos nosso novo extractor. Em “Grok pattern” você deve colocar a pattern que usara, o nome deve ser o mesmo que configuramos nas etapas anteriores, ou da pattern que for usar. Deve ficar como está na imagem dentro do %{}. Você pode clicar em Try para testar se está funcionando.

21

Em seguida para nossa configuração básica apenas configuramos o title, que é o nome que vamos dar ao extractor, no casso o nosso ficou “Apache Access”.

22

Para um ambiente de produção e se você estiver coletando outros logs além do apache através do Sidecar eu recomendo usar a opção “Condition” para que ele não processe todas as mensagens.

Nossos logs agora já devem estar mais “bonitos”:

23

Vamos agora criar um dashboard para finalizar. Na pagina “Dashboard” clique em “Create Dashboard”, dê um nome e uma descrição para seu dashboard.

24

Vamos agora voltar para o “Search” e fazer a seguinte pesquisa dentro do período de 24h(last 1 day): file:/var/log/httpd/access_log AND response:4??

25

Com essa busca estou pegando todas as respostas 4XX que ele achar nos logs do arquivo access.log. Estou levando em consideração que só tenho esse web server, mas você poderia pesquisar pelo nome do host ou o que preferir. Clique em “Add count to dashboard” e selecione o Dashboard que criamos. Abrira a seguinte janela, só colocar um titulo, marcar as opções se preferir e mandar criar.

26

E pronto , nosso widget já deve estar funcionando:

27

 

Referencias:
Grok Patterns: https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html
Filebeat: https://www.elastic.co/guide/en/beats/filebeat/current/index.html
Sidecar: http://docs.graylog.org/en/2.1/pages/collector_sidecar.html