Obtendo IP real em uma aplicação web atrás de um proxy reverso

Quando utilizamos um proxy reverso como varnish ou nginx (até mesmo com o apache da pra fazer isso) temos um pequeno problema em aplicações que logam ip do usuário (como um sistema de comentários, por exemplo).

Ao configurar um proxy reverso, normalmente denominamos um header separado para o IP real da aplicação, pode ser qualquer header, mas normalmente é utilizado o header XForwardedFor (que chamamos de XFF)

Existem diversas soluções para isto, a primeira atraves de php, bastando inserir o código abaixo em algum arquivo de include global (como arquivo de conexão ao banco)

<?php
$_SERVER['REMOTE_ADDR'] = $_SERVER['X_FORWARDED_FOR'];
?>

Para uma solução a nível de webserver (apache) podemos usar o mod_rpaf.
Para instalar no ubuntu (e distros baseadas em debian)

apt-get install libapache2-mod-rpaf

Para demais distros, pode-se obter o source na página do projeto:
http://stderr.net/apache/rpaf/

Manipulação de usuários MySQL

Dica básica, mas tem gente que se embanana com isso.

Cenário: Criar uma base de dados chamada mydb, criar um usuário chamado myuser com permissão de acesso total a esta base de dados e acesso somente a localhost.

Primeiramente conectamos ao mysql como root e criamos a base de dados mydb

mysql -u root -pMinhaSenhA
create database mydb;

Agora uma dica legal, da pra criar usuários mysql apenas adicionando permissões. basicamente quando tu manda um grant e o usuário não existe, o mysql cria ele automaticamente… sabendo usar isso é muito bom 😉

Agora criamos então o usuário e adicionamos permissão as interfaces loopback 127.0.0.1, localhost e ::1 (loopback ipv6)

mysql u root -pMinhaSenhA
GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'localhost' IDENTIFIED BY 'MinhaSenhA';
GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'127.0.0.1' IDENTIFIED BY 'MinhaSenhA';
GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'::1' IDENTIFIED BY 'MinhaSenhA';

Agora testamos o acesso, deve ser exibido somente a base mydb e information_schema (no meu caso aparece também uma base do capeta chamada test que o ubuntu criou automaticamente, mas nada qe um “drop database test;” não resolva)

mysql -u myuser -pMinhaSenhA
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 70
Server version: 5.5.20-0~ppa1~oneiric (Ubuntu)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb               |
| test               |
+--------------------+
3 rows in set (0.00 sec)

Agora sim, tudo criado e funcionando! 😉