Infotech Notes

26/Outubro/2009

Apache autenticando em LDAP/LDAPS

Arquivado em: Uncategorized — Gustavo @ 1:01 pm

Para a realização de autenticação de usuários do serviço web fornecido por um Apache em uma base LDAP, a configuração é extremamente simples.

Supondo que voce já tem um servidor LDAP rodando e autenticando seus usuários corretamente (se não tiver, veja meus posts anteriores) e seu servidor web funcionando corretamente, basta editar seu arquivo de configuração do servidor web, normalmente localizado em /etc/httpd/conf/httpd.conf, e ter a certeza de que estas linhas estarão presentes nele.

DocumentRoot “/var/www/html”

LDAPTrustedCA           /etc/openldap/cacerts/cacert.pem
LDAPTrustedCAType       BASE64_FILE
LDAPOpCacheTTL          1800
LDAPCacheTTL            1800
LDAPOpCacheEntries      1024

<Directory “/var/www/html”>

Options Indexes FollowSymLinks

AllowOverride None

Order deny,allow
Deny from All
AuthLDAPEnabled on
AuthName “Autenticacao LDAP”
AuthType Basic
AuthLDAPUrl
ldaps://ldap.server/ou=OrgUnit,o=Org?uid
AuthLDAPAuthoritative on
Require valid-user
Satisfy any

Order allow,deny
Allow from all

</Directory>

Vale a pena observar aqui que a comunicação entre o servidor web e o servidor LDAP acontece na porta 636 (LDAP com TLS).

Caso voce tenha alguma dúvida sobre os parametros do Apache, siga este link http://httpd.apache.org/docs/2.0/mod/mod_auth_ldap.html

Depois disso, basta reiniciar o serviço.

15/Outubro/2009

Horário de verão brasileiro até 2078

Arquivado em: Uncategorized — Tags: — Gustavo @ 12:40 pm

Novamente temos em nossas mãos a responsabilidade de acertar os relógios dos nossos computadores, além de ser sempre solicitado a acertar o relógio dos micros dos parentes, vizinhos, namoradas, ex-namoradas, amantes, etc.

Este ano o governo brasileiro decidiu facilitar um pouco e definiu datas fixas de início e encerramento do período de Horário de Verão.  Este decreto nº 6.558, de 8 de setembro de 2008, instituiu o início sempre à zero hora do terceiro domingo de outubro e o encerramento sempre à zero hora do terceiro domingo de fevereiro do ano seguinte.

Infelizmente, como em toda decisão governamental, há uma condição que impede a automatização definitiva do Horário de Verão nos computadores: se o terceiro domingo de fevereiro for um domingo de Carnaval então o encerramento é automaticamente transferido para zero hora do domingo seguinte.

Para facilitar um pouco a nossa vida (e a minha também, pois muitos micros e servidores não terão mais que ser ajustados), eu estou colocando um script que define o horário de verão brasileiro até o ano de 2078. Eu montei este script com base nas datas de carnaval definidas nesta Tabela de Páscoa, Carnaval e Corpus Christi, de 1951 a 2078, publicado nesta página na UFRGS.

Neste arquivo tem um script preparado para Linux, que ajudará voce a acertar estes horários nestes sistemas. Salve em um arquivo hv.sh e rode-o como root

É claro que eu sugiro que voces verifiquem o path do utulitário zic (costuma ficar em /usr/sbin/), para que as alterações sejam feitas corretamente.

Depois que o script for executado, basta rodar este comando para verificar as alterações:

# /usr/sbin/zdump -v Brazil/East | egrep “2009|2010″

9/Junho/2009

Autenticação por chaves

Arquivado em: Uncategorized — Gustavo @ 2:18 pm

Para quem não tem muita paciencia em ficar digitando a sua senha cada vez que se loga em uma máquina linux/unix, ou para quem executa scripts que vez ou outra necessitam obter informações de máquinas remotas, existe uma maneira de realizar um acesso seguro, através de SSH, para obter estas informações.

O legal do SSH, é que voce pode realizar um acesso com o comando e obter o resultado facilmente.

Por exemplo, imagine que voce criou um script chamado script.sh e que roda no servidor A e que este script necessita obter alguma informação que está no servidor B. Só que para obter esta informação, é necessário que voce se logue no servidor B, execute um comando, e pegue este resultado para continuar trabalhando.

Isto pode ser feito assim:

[user@serv-a ~]$ ssh -l user@serv-b

user@serv-b’s password:
Last login: Tue Jun  9 12:07:20 2009 from serv-c

[user@serv-b ~]$

[user@serv-b ~]$ ps -ef | grep nscd

nscd     22431     1  0 Apr28 ?        00:00:03 /usr/sbin/nscd

[user@serv-b ~]$ exit

[user@serv-a ~]$

Em resumo, voce loga na maquina remota, informa seu usuario e senha, executa o comando e volta pra sua maquina anterior.

Se isto for feito uma única vez, então não há qualquer problema, mas imagine realizar isto várias vezes ao dia, ou então usar um script para verificar se o NSCD está no ar, e se não estiver, então o processo deve ser re-iniciado.

O grande problema aqui é a autenticação. Não é possível executar comandos de shell usando HTTP (não de maneira simples ou automatizada) ou FTP. Deve-se utilizar o SSH.

Para fazer com que este “problema” de autenticação não atrapalhe o seu script, voce deve usar chaves para realizar a autenticação.

Faça assim:

[user@serv-a ~]$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
6d:9f:70:8a:b1:78:ea:12:85:49:d1:ac:ef:15:74:c7 user@serv-a
[user@serv-a ~]$

Este comando vai gerar um par de chaves pública/privada, com o algoritmo RSA, com tamanho 2048 bits.

Os arquivos estão localizados em /home/user/.ssh

O arquivo id_rsa é a chave privativa e o arquivo id_rsa.pub é a chave pública.

Agora faça um login no servidor b, e copie o conteúdo do arquivo id_rsa.pub para o arquivo /home/user/.ssh/authorized_keys

Salve e saia, deslogue do servidor B e refaça o login no servidor B. Voce verá que a sua senha não será mais pedida.

Aqui vai uma dica. Para executar o seu comando mostrado acima, execute o comando e veja o resultado:

[user@serv-a ~]$ ssh -l user@serv-b “ps -ef | grep nscd”

nscd     22431     1  0 Apr28 ?        00:00:03 /usr/sbin/nscd

[user@serv-a ~]$

O único cuidado que voce precisa ter é que se alguém obtiver uma cópia de seu arquivo id_rsa, esta pessoa poderá usar seu login para acesso a qualquer máquina que tenha a sua chave pública.

É por isso que o arquivo id_rsa tem modo 0600 e o diretório .ssh tem modo 700.

20/Fevereiro/2009

Arquivado em: Uncategorized — Gustavo @ 10:56 pm

A carreira de engenheiro nos novos moldes:

A Carreira em “Y”
Nas grandes empresas (Bradesco, Votorantim, HSBC, Sony, Brasil Telecom, GM, ou qualquer empresa que tenha um grande número de pessoal de tecnologia) rola o que eles chamam de carreira em Y.  O indivíduo começa como Engenheiro 1 e pode chegar a ser Engenheiro 8.
Engenheiros 1
São comumente conhecidos como Engenheiros baby, ou seja, um pouco mais que estagiários.

Condições necessárias para voce virar Engenheiro 2, 3, 4, 5, 6, 7 e 8:

Engenheiros 2 e 3
Faça o seu dever, cumpra seus prazos, fique algumas vezes depois do  horário, faça cursos de aperfeiçoamento, seja sociável e trabalhe em equipe. É  necessário destruir plantações de pepinos (1 pepino = 1 problema).

Noções de Inglês Técnico.

Exemplo: Humanos normais

Engenheiro 4
Idem ao anterior + matar um leão por dia (1 leão = um grande problema), com  uma carga horária de 12 horas diárias. Ser responsável por 30% da administração de uma rede pequena tipo 700 usuários.

Inglês, espanhol e  Visual Basic obrigatórios + 1 linguagem desejável.

Exemplo: Fodões

Engenheiro 5
Idem ao anterior + um dragão por semana (1 dragão = um problema enorme),  com uma carga horária diária de 16 horas, sem feriados. Ser responsável por 40%  da administração de uma rede do tipo 1.000 usuários.

Inglês, francês, japonês, espanhol, VB e C++ obrigatórios.

Exemplo: Mister M, David Coperfield, Padre Quevedo, Chronos, Thomas Green Morton (Rá!).

Engenheiro 6
Idem aos anteriores, só que, mata-se 1 leão por hora, um dragão por dia, um ALIEN por semana (1 ALIEN = um problema do outro mundo) e mais uma área  equivalente a meio globo terrestre em plantações de pepino. Carga horária  diária de 20 horas. Ser responsável por 75% da administração de uma rede de  2.500 usuários e 30% de todos os projetos internos de tecnologia.

Inglês,  francês, alemão, japonês, espanhol, aramaico, latim, mandarim, vietnamita,  VB, C++, ASP, PHP, DHTML, Cobol obrigatórios.

Exemplo: Criaturas Mitológicas, Gnomos, NINJAS com o poder dos 9 cortes.

Obs. Assim como os NINJAS, somente um Engenheiro 6 pode matar um Engenheiro 6.

Engenheiro 7
Idem aos anteriores, só que, os leões e dragões fogem de você. Você terá  que caçá-los em outras dimensões e planetas. Uma área equivalente a uma estrela  classe 5 (Sol) em plantações de pepino e três ALIENS e um PREDADOR por dia  (1 PREDADOR = um problema impossível de ser resolvido, exemplo, fazer um  corpo com massa “m” viajar com velocidade acima da velocidade da luz).
Carga horária diária de 25 horas. Ser responsável por 100% da administração  de uma rede de 6.000 usuários e 60% de todos os projetos internos de  tecnologia.

Inglês, francês, alemão, japonês, italiano, espanhol, aramaico, latim,  mandarim, vietnamita, Borg, Klingon, pascal, fortran, C#, ASP, JAVA, XML,  EasyTrieve, IMS/DC, Telon e todas as 13500 línguas e dialetos que o C3PO  fala no filme Star Wars, obrigatórios.

Exemplo: Mago Merlin, JEDIs como Luck Skywalker e Obi-Wan Kenobi, Mestre  Yoda (daí o nome de carreira em Y), Darth Maul, SPECTROMAN.

Não desanime.  Conseguir você irá, um engenheiro 7 você será.

Grande poder tem o lado negro ADMINISTRATIVO da FORÇA.

Você também terá que ser um HIGHLANDER, pois só com uma vida eterna você  terá tempo para atingir este cargo, mas não se esqueça que só pode haver  um, e não deixe que nenhum outro engenheiro 7 corte sua cabeça.

Engenheiro 8
É o cargo máximo no UNIVERSO e você será considerado como o mestre dos  elementos. Você terá o poder sobre a vida e a morte dos seres, logo você  não precisa mais matá-los, você apenas deseja que os problemas se resolvam ou  cria novas leis físicas no universo para que isso aconteça. E você irá  perdoar a todos. Você será onisciente, onipresente e onipotente. Carga  horária diária indefinida, para você o tempo e o espaço já não existem. Ser  responsável por 100% dos projetos e 100% da área de tecnologia de uma  empresa de 30.000 usuários, em 7 dias por semana.

Exemplo: GAIA, ZEUS, ODIN, A FORÇA.

5/Janeiro/2009

RAID

Arquivado em: Uncategorized — Gustavo @ 9:30 pm

A palavra RAID é um acronimo para Redundant Array of Inexpensive Disks que surgiu em 1988 e oferece basicamente:

  • Ganho de desempenho no acesso para leitura ou gravação
  • Redundancia em caso de falha em um dos discos
  • Uso múltiplo de várias unidades de discos
  • Escalabilidade em recuperação de conteúdo

Existem hoje duas maneiras de criar um RAID – via Software ou via Hardware

O RAID feito via Software é feito através de softwares e módulos do kernel do Linux e só começa a funcionar após o kernel ser carregado (boot da máquina). Por este motivo não é possível utilizar o RAID via software na partição de boot.

Já o RAID criado via hardware permite incluir todas as partições do disco, inclusive a /boot. Neste caso, toda a configuração de RAID é feito através de uma placa controladora externa, onde se conectam os discos. Esta controladora é a responsável pelas funções de escrita e gravação, informando à máquina o(s) disco(s) disponível(is) para a instalação do(s) Sistema(s) Operacional(is), seja ele Linux, Windows ou outro. O grande problema é que se a controladora falhar, nada mais é acessado. Os discos SCSI e SATA oferecem este tipo de RAID.

Existem diversas configurações de RAID. As mais comuns são 0, 1 e 5.

O RAID 0 é o único nível que não implementa redundancia. A sua finalidade é aumentar o desempenho na leitura e gravação dos dados. Pense assim, se voce fizer RAID 0 com 3 discos de 72 GB, voce terá cerca de 210 GB de espaço total em disco. Se um destes 3 discos apresentar algum problema, voce perde todos os seus 210 GB de dados. Voce também pode usar quantos discos quiser e discos de tamanhos diferentes para criar este único discão.

O RAID 1 trabalha com dois discos, e cria um espelho de um disco no ooutro. Neste caso, se houver um problema em um dos discos, voce tem o outro para garantir os seus dados. Neste modo, a grande vantagem é o tempo de leitura, pois os dados são lidos dos dois discos ao mesmo tempo, duplicando o volume de dados lidos pelos discos. A desvantagem é que, se voce tem dois discos de 140 GB em RAID1, o seu disco total é de 140 GB.

O RAID 5 traz as vantagens do RAID 0 e 1, mas também alguma desvantagem. Em uma configuracao com 3 discos de 72 GB, voce fica com um discão de 140GB. 1/3 do espaço total dos discos é usado para a geração dos dados de redundancia. A vantagem é que este RAID fornece um bom ganho de desempenho na leitura. Quanto mais discos voce tiver neste RAID, mais rápida será a leitura, pois os dados são gravados espalhados.

Para configurar um RAID e administrá-lo, voce precisa da ferramenta mdadm, que é fornecida para todas as distribuições linux que suportam RAID.

Após a instalação da ferramenta, vamos considerar um único disco com 3 partições disponíveis e ainda não montadas ou em uso, e vamos criar 1 x RAID 1 utilizando estas 3 partições, sendo que uma delas será usada como disco spare.

Modifique as partições que serão usadas no RAID para o label “Linux raid auto”, código fd no fdisk.

# fdisk /dev/hda

Para acompanhar o estado de seus discos durante a criação do RAID, use o seguinte comando em um terminal separado

# watch cat /proc/mdstat

Para criar o RAID, utilize este comando

# mdadm –create /dev/md0 –level=1 –raid-devices=2 –spare-devices=1 /dev/hda5 /dev/hda6 /dev/hda7

Onde:

–create /dev/md0 ==> é o device que será criado.

–level=1 ==> indoca que usaremos RAID 1.

–raid-devices=2 ==> indica que teremos 2 partições ativas.

–spare-devices=1 ==> indica que 1 das 3 partições informadas será usada para spare.

As partições mencionadas no final do comando indicam quais serão as partições usadas. A última partição, neste caso, será usada para spare.

Caso o comando fosse este abaixo, então teríamos 2 discos de spare, respectivamente hda7 e hda8

# mdadm –create /dev/md0 –level=1 –raid-devices=4 –spare-devices=2 /dev/hda5 /dev/hda6 /dev/hda7 /dev/hda8

A partir de agora, com o RAID criado, basta criar o filesystem e usar a nova partição. Vou criar usando ext3

# mkfs.ext3 /dev/md0

Crie um ponto de montagem e monte a partição.

# mkdir /mnt/raid
# mount -t ext3 /dev/md0 /mnt/raid

Caso voce queira montar esta partição automoaticamente, altere o arquivo /etc/mdadm/mdadm.conf adicionando as linhas

DEVICE /dev/hda5 /dev/hda6 /dev/hda7 /dev/hda8
ARRAY /dev/md0 devices=/dev/hda5,/dev/hda6,/dev/hda7,/dev/hda8


E altere também o /etc/fstab

/dev/md0 /mnt/raid ext3 defaults 0 2

Para verificar o estado do RAID como um todo, use o comando


# mdadm –detail /dev/md0


/dev/md0:
Version : 00.90.01
Creation Time : Fri Oct 17 18:03:09 2008
Raid Level : raid1
Array Size : 240832 (235.23 MiB 246.61 MB)
Device Size : 240832 (235.23 MiB 246.61 MB)
Raid Devices : 2
Total Devices : 3
Preferred Minor : 0
Persistence : Superblock is persistent

Update Time : Fri Jan 03 18:05:12 2008
State : clean
Active Devices : 2
Working Devices : 3
Failed Devices : 0
Spare Devices : 1

UUID : a78bd919:2301b5b2:da567592:1bd866f6
Events : 0.8

Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/hda5
1 8 18 1 active sync /dev/hda6

2 8 19 – spare /dev/hda7

13/Setembro/2007

Kernel

Arquivado em: Uncategorized — Gustavo @ 1:33 am

Particularmente o processo de compilação é relativamente simples. O que pega mesmo é o que voce vai compilar (ou melhor, o que será compilado juntamente com a base e o que será compilado como módulo). O comentário é que, se voce usa algum recurso mais de uma vez em uma mesma semana, então compile o suporte a este recurso diretamente no kernel. Caso contrário, compile-o como módulo.

O sistema utilizado nestes passos foi um Debian 3.1 r5, com kernel padrão 2.4.27. O kernel compilado foi o 2.6.13, mas os passos para compilar qualquer outro kernel da série 2.6 é o mesmo.

Para iniciar, vá até o site http://www.kernel.org/pub/linux/kernel/v2.6/ e pegue o arquivo linux-2.6.13.5.tar.bz2.

Salve este arquivo em qualquer lugar no seu sistema. Realize a descompactação e untar do mesmo com o comando tar xvjf linux-2.6.13.5.tar.bz2 -C /usr/src

Vá até o diretório /usr/src e crie um link para linux com o comando ln -s linux-2.6.13.5 linux

Instale alguns aplicativos necessários para começarmos a configurar o seu kernel e depois compilá-lo. Vale lembrar que o compilador C deve estar instalado no seu sistema. Caso não esteja, basta adicionar a parte entre colchetes na linha abaixo.
# aptitude install libncurses5 libncurses5-dev initrd-tools [gcc g++]

Após o término da instalação destes aplicativos, vá para o diretório linux e edite o arquivo Makefile. Na variavel Extraversion, coloque alguma string que identifique que este kernel foi compilado por voce. Salve e saia.

Execute o comando make menuconfig, e escolha as opções para que sua máquina funcione corretamente. Uma dica é utilizar os comandos lsusb e lspci para listar o hardware que sua máquina tem atualmente. Caso voce não encontre estes comandos, basta instalar os pacotes pciutils e usbutils

Este passo de configuração deve serfeito com bastante calma, pois dependendo da sua configuração algumas configurações especiais precisarão existir, e isto depende exclusivamente do hardware que voce possui. Lembre-se de salvar o arquivo de configuração com o nome .config.

Depois de salvar a sua configuração, efetue uma cópia de segurança de seu arquivo de configuração, apenas para manter registro. Caso a sua compilação não funcione, ou a máquina não consiga bootar com o novo kernel, voce deve voltar à prancheta novamente e verificar a sua configuração.

Bom, pensando que a sua configuração está OK, vamos executar a compilação propiamente dita. Para isso, basta digitar make.

Após uns 20 a 30 minutos de trabalho de seu micro, o seu novo kernel já está compilado. Como na série 2.6 a compilação dos módulos já acontece juntamente com a compilação do kernel, basta copiarmos estes módulos compilados para seu local padrão, que deve ser /lib/modules/2.6.13.5_sua-string. Isto é feito com o comando make módules_install

Copie o arquivo bzImage para o diretório /boot. Minha sugestão é que voce renomeie este arquivo para algo mais esclarecedor, como por exemplo kernel-2.6.13.5_sua-string. Use o comando cp /usr/src/linux/arch/i386/boot/bzImage /boot/kernel-2.6.13.5_sua-string

Vamos criar o arquivo de inicialização. Para fazer isso, use o comando mkinitrd -o /boot/initrd.img-2.6.13.5_sua-string /lib/modules/2.6.13.5_sua-string.

Agora o último passo é configurar o boot loader, ou o GRUB como é mais conhecido. Edite o arquivo /boot/grub/menu.lst e vá até o final do arquivo. Lá voce deve encontrar linhas semelhantes a estas abaixo.

title                                                      Debian GNU/Linux, kernel 2.4.27
root                                                      (hd0,0)
kernel                                                   /vmlinuz-2.4.27 root=/dev/sda3 ro
initrd                                                    /initrd.img-2.4.27
savedefault

Faça uma cópia destas linhas e coloque no final do arquivo. De acordo com as informações acima, suas linhas devem se parecer com estas

title                                                       Debian GNU/Linux, kernel 2.6.13.5_sua-string
root                                                       (hd0,0)
kernel                                                    /vmlinuz-2.6.13.5_sua-string root=/dev/sda3 ro
initrd                                                     /initrd.img-2.6.13.5_sua-string
savedefault

Prontinho. Agora basta ajoelhar e torcer para que sua máquina suba com o novo kernel compilado por voce.

Módulos

Eu mencionei a compilação automática dos módulos quando o kernel foi compilado. Mas como é a utilização e/ou gerenciamento destes módulos compilados ?

A princípio, quando o kernel necessita de uma funcionalidade que é suprida pelo módulo, o próprio kernel se encarrega de carregá-lo, mas voce pode carregá-lo usando o comando modprobe.

Pense no iptables. Mesmo quando voce compila todo o iptables no kernel, algumas características são fornecidas somente através de módulos, como o Connection Track ou o Stablished/Related. Quando voce chama o iptables com estas características, dois módulos são carregados para que estas características estejam disponíveis: ipt_state e ip_conntrack.

Então, depois que estes módulos foram carregados, execute um lsmod para ver se eles estão realmente lá. É possível também ver quais módulos estão carregados como comando cat proc/modules

Para verificar quais módulos estão disponíveis (compilados) para serem usados, basta executar um modprobe -l. Todos os arquivos que terminam em .ko são os módulos compilados e estão à sua disposição.

O comando modinfo mostra diversas informações sobre o módulo, inclusive se ele depende de algum outro módulo. Existe um arquivo chamado modules.dep que relaciona todos os módulos e suas dependencias. Caso haja algum problema com a carga de algum módulo por causa de suas dependencias, isto pode ser por algum erro neste arquivo. A melhor coisa a fazer é remover este arquivo e refaze-lo. O arquivo encontra-se em /lib/modules/$(uname -r)/modules.dep e para reconstruí-lo, use o comando depmod.

Para remover um módulo da memória, utilize o comando rmmod ou modprobe -r

Blog no WordPress.com.