Em meu servidor web copiei uma pasta para /var/www/html/expresso. Só que quando abro é retornado o erro "403 Forbidden". Isso é devido ao selinux, devemos compilar uma regra que permita o que está sendo proibido. Para saber o que está sendo proibido, monitore o "/var/log/messages":
tail -f /var/log/messages
Agora, faça novamente a ação que está sendo proibida. Provavelmente será logado no "/var/log/messages" algo semelhante ao abaixo:
Sep 10 11:24:53 MODELO kernel: type=1400 audit(1284128693.063:71): avc: denied { getattr } for pid=17417 comm="httpd" path="/var/www/html/expresso/index.php" dev=sdb1 ino=184145 scontext=root:system_r:httpd_t:s0 tcontext=root:object_r:user_home_t:s0 tclass=file
Sep 10 11:24:53 MODELO kernel: type=1400 audit(1284128693.065:72): avc: denied { getattr } for pid=17417 comm="httpd" path="/var/www/html/expresso/index.php" dev=sdb1 ino=184145 scontext=root:system_r:httpd_t:s0 tcontext=root:object_r:user_home_t:s0 tclass=file
Gere um arquivo temporario com essas mensagens:
vim /tmp/regras
...
Sep 10 11:24:53 MODELO kernel: type=1400 audit(1284128693.063:71): avc: denied { getattr } for pid=17417 comm="httpd" path="/var/www/html/expresso/index.php" dev=sdb1 ino=184145 scontext=root:system_r:httpd_t:s0 tcontext=root:object_r:user_home_t:s0 tclass=file
Sep 10 11:24:53 MODELO kernel: type=1400 audit(1284128693.065:72): avc: denied { getattr } for pid=17417 comm="httpd" path="/var/www/html/expresso/index.php" dev=sdb1 ino=184145 scontext=root:system_r:httpd_t:s0 tcontext=root:object_r:user_home_t:s0 tclass=file
...
Desligue o selinux temporariamente
setenforce 0
Transforme o arquivo de regras na linguagem do selinux
audit2allow -m local -l -i /tmp/regras > /tmp/regras.te
Compile as regras
checkmodule -M -m -o /tmp/regras.mod /tmp/regras.te
Crie um pacote de instalação
semodule_package -o /tmp/regras.pp -m /tmp/regras.mod
Instale as novas regras
semodule -i /tmp/regras.pp
Ligue o selinux novamente
setenforce 1
Monitore novamente o arquivo "/var/log/messages" e faça novamente a ação que estava sendo proibida. Teoricamente se tudo ocorreu bem, seu site abrirá sem maiores problemas.
Mostrando postagens com marcador selinux. Mostrar todas as postagens
Mostrando postagens com marcador selinux. Mostrar todas as postagens
sexta-feira, 1 de outubro de 2010
sexta-feira, 14 de maio de 2010
Linux - como montar diretório /var em outro disco?
As vezes o diretório /var cresce demasiadamente devido a logs de programas. Por isso surge a necessidade de separá-lo em outro disco. Mas como fazer isso se nosso servidor já está em produção há algum tempo?
Nesse exemplo, estamos utilizando máquinas virtuais VMware esxi, porém a ideia pode ser usada para máquinas físicas também.
-------------------------------------------------------
[Passo 1: adicionando disco]
- Ao adicionar o novo disco, o servidor deve ser reiniciado para que o mesmo seja reconhecido, infelizmente o servidor terá algum tempo de indisponibilidade.
- Após a reinicialização, digite o comando "fdisk -l" para ver qual device corresponde ao novo disco. A saída é semelhante a seguir:
...
Disk /dev/sdb: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
..
Nota: adicionei um disco de 34GB, logo, sei que /dev/sdb só pode ser ele.
-------------------------------------------------------
[Passo 2: particionando e formatando disco]
- O novo disco deve ser particionado, utilize o comando "fdisk":
# fdisk /dev/sdb
- No menu do comando fdisk, digite "n" para criar uma nova partição, e digite "w" para gravar as alterações.
- Após particionado, o device "/dev/sdb1" será criado, o mesmo deve ser formatado. Utilizo o sistema de arquivos "ext3" para formatar discos linux:
# mkfs.ext3 /dev/sdb1
-------------------------------------------------------
[Passo 3: preparando novo disco para receber arquivos /var]
- Após formatarmos o novo disco, devemos monta-lo para certificar que o mesmo esteja vazio. Utilize o comando "mount":
# mount /dev/sdb1 /mnt
- Abra a pasta /mnt com o comando "cd":
# cd /mnt
- Perceba que geralmente a pasta "lost+found" é criada após formatar o disco, apague tudo com o comando "rm":
# rm -r /mnt/*
-------------------------------------------------------
[Passo 4: copiando arquivos de /var para /dev/sdb1]
- Como o novo disco "/dev/sdb1" está montado em "/mnt", basta copiarmos o conteúdo de "/var" para "/mnt" com o comando "cp":
# cp -rdp --preserve=context /var/* /mnt
Nota: por quê "-rdp --preserve=context"? R.: "r" faz cópia de diretórios; "d" mantém links; "p" mantém permissões; "--preserve=context" mantém o contexto do selinux caso a distribuição possua ele habilitado.
-------------------------------------------------------
[Passo 5: elegendo /dev/sdb1 como novo /var]
- Após a cópia, os arquivos de "/var" podem ser apagados. Em nosso caso, somente renomearemos para manter backup. Utilize o comando "mv":
# mv /var /var.original
- Crie uma nova pasta "/var" para servir como ponto de montagem do dispositivo "/dev/sdb1". Utilize o comando "mkdir":
# mkdir /var
- Edite o arquivo "/etc/fstab" para que o dispositivo "/dev/sdb1" seja montado automaticamente em "/var". Utilize um editor de sua preferência e adicione a seguinte linha (sem ...):
...
/dev/sdb1 /var ext3 defaults 0 0
...
- Desmonte "/mnt" com o comando "umount":
# umount /mnt
- Teste o novo ponto de montagem com o comando "mount":
# mount /var
-------------------------------------------------------
[Passo 6: SOMENTE PARA SISTEMAS COM SELINUX]
- Em sistemas com selinux, no passo 5 quando criamos a nova pasta "/var", essa não possui permissões relativas ao /var original. Veja essa diferença com o comando "ls":
# ls -Z
- Para que as permissões selinux sejam restauradas no novo "/var", execute o comando "restorecon":
# restorecon /var
- A partir desse passo, tudo deve funcionar corretamente. Se quiser, reinicie o servidor para testar.
Nesse exemplo, estamos utilizando máquinas virtuais VMware esxi, porém a ideia pode ser usada para máquinas físicas também.
-------------------------------------------------------
[Passo 1: adicionando disco]
- Ao adicionar o novo disco, o servidor deve ser reiniciado para que o mesmo seja reconhecido, infelizmente o servidor terá algum tempo de indisponibilidade.
- Após a reinicialização, digite o comando "fdisk -l" para ver qual device corresponde ao novo disco. A saída é semelhante a seguir:
...
Disk /dev/sdb: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
..
Nota: adicionei um disco de 34GB, logo, sei que /dev/sdb só pode ser ele.
-------------------------------------------------------
[Passo 2: particionando e formatando disco]
- O novo disco deve ser particionado, utilize o comando "fdisk":
# fdisk /dev/sdb
- No menu do comando fdisk, digite "n" para criar uma nova partição, e digite "w" para gravar as alterações.
- Após particionado, o device "/dev/sdb1" será criado, o mesmo deve ser formatado. Utilizo o sistema de arquivos "ext3" para formatar discos linux:
# mkfs.ext3 /dev/sdb1
-------------------------------------------------------
[Passo 3: preparando novo disco para receber arquivos /var]
- Após formatarmos o novo disco, devemos monta-lo para certificar que o mesmo esteja vazio. Utilize o comando "mount":
# mount /dev/sdb1 /mnt
- Abra a pasta /mnt com o comando "cd":
# cd /mnt
- Perceba que geralmente a pasta "lost+found" é criada após formatar o disco, apague tudo com o comando "rm":
# rm -r /mnt/*
-------------------------------------------------------
[Passo 4: copiando arquivos de /var para /dev/sdb1]
- Como o novo disco "/dev/sdb1" está montado em "/mnt", basta copiarmos o conteúdo de "/var" para "/mnt" com o comando "cp":
# cp -rdp --preserve=context /var/* /mnt
Nota: por quê "-rdp --preserve=context"? R.: "r" faz cópia de diretórios; "d" mantém links; "p" mantém permissões; "--preserve=context" mantém o contexto do selinux caso a distribuição possua ele habilitado.
-------------------------------------------------------
[Passo 5: elegendo /dev/sdb1 como novo /var]
- Após a cópia, os arquivos de "/var" podem ser apagados. Em nosso caso, somente renomearemos para manter backup. Utilize o comando "mv":
# mv /var /var.original
- Crie uma nova pasta "/var" para servir como ponto de montagem do dispositivo "/dev/sdb1". Utilize o comando "mkdir":
# mkdir /var
- Edite o arquivo "/etc/fstab" para que o dispositivo "/dev/sdb1" seja montado automaticamente em "/var". Utilize um editor de sua preferência e adicione a seguinte linha (sem ...):
...
/dev/sdb1 /var ext3 defaults 0 0
...
- Desmonte "/mnt" com o comando "umount":
# umount /mnt
- Teste o novo ponto de montagem com o comando "mount":
# mount /var
-------------------------------------------------------
[Passo 6: SOMENTE PARA SISTEMAS COM SELINUX]
- Em sistemas com selinux, no passo 5 quando criamos a nova pasta "/var", essa não possui permissões relativas ao /var original. Veja essa diferença com o comando "ls":
# ls -Z
- Para que as permissões selinux sejam restauradas no novo "/var", execute o comando "restorecon":
# restorecon /var
- A partir desse passo, tudo deve funcionar corretamente. Se quiser, reinicie o servidor para testar.
terça-feira, 11 de maio de 2010
centos + httpd + php + pgsql + selinux: Unable to connect to PostgreSQL server: could not connect to server: Permission denied
Uma forma de resolver esse problema é desativar o selinux somente para o httpd.
Execute o seguinte comando:
# setsebool -P httpd_can_network_connect_db=1
Execute o seguinte comando:
# setsebool -P httpd_can_network_connect_db=1
Assinar:
Postagens (Atom)