Projeto Integrador - 2011.1 - Teletec

De MediaWiki do Campus São José
Revisão de 15h26min de 12 de julho de 2011 por Vagner.c (discussão | contribs)
Ir para navegação Ir para pesquisar

* Equipe 2 : TELETEC


INTEGRANTES TELETEC

* Daniel Estefano;      estefano.daniel@gmail.com 
* Denis Teixeira;       denisteixeira3@gmail.com 
* Leonardo Oliveira P.; leonardo-op@live.com 
* Odair de Moraes;      odairdmoraes@hotmail.com
* Robson de Carvalho;   rob_carvalho12@hotmail.com
* Vagner Cordeiro.      cordeirotelecom@gmail.com

SOBRE A EMPRESA TELETEC - PROVEDORA DE ACESSO Á INTERNET:

Empresa especializada no ramo das Telecomunicações Oferece os seguintes serviços: 

# Conta de Usuário para cada cliente;
# Conta de E-mail para cada cliente;
# Uma página Web Padrão;
# Instalação do Modem ADSL e do Cabeamento Estrurado;
# Acesso Wirelles;
# Suporte 24Horas. 
Contamos com 6 Técnicos em Telecomunicações especialistas no setor de redes para todo o suporte necessário.
Contate um de nossos especialistas através do e-mail teletecifsc.googlegroups.com e faça já seu orçamento.

Etapas Iniciais de Configurações da Rede

# Instalação do Sistema Operacional:Ubuntu-Server;
# Definido Sistema de Arquivo, Dividido em 3 Partições: 1 Partição Primátia, 1 Partição Secundária e uma Partição para Swap; 
# Definido nome do Domínio: teletec.sj.ifsc.edu.br;
# Criado um Usuário: Tecnico;
# Acesso via SSH ao Servidor Teletec.

Gerencia de Redes: Apache, Postfix e DNS

Configurações do servidor DNS:

- Edição do Arquivo para IP Estático: /etc/network/interfaces

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet static
               address 200.135.37.100
               netmask 255.255.255.192
               gateway 200.135.37.126  

- Edição do Arquivo do servidor DNS /etc/bind/named.conf

Indica todos os arquivos que irão fazer a configuração do DNS, incluindo os 3 principais defaults: named.conf.options, named.conf.local e o named.conf.default-zones.

// This is the primary configuration file for the BIND DNS server named.
//
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the 
// structure of BIND configuration files in Debian, *BEFORE* you customize 
// this configuration file.
//
// If you are just adding zones, please do that in /etc/bind/named.conf.local
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";
include "/etc/bind/robson.conf";

- Edição do Arquivo de servidor DNS: named.conf.local /etc/bind/named.conf.local

É um arquivo padrão do BIND onde foi configurado o o nosso dominino TELETEC.

//
// Do any local configuration here
//

// Consider adding the 1918 zones here, if they are not used in your
// organization
//include "/etc/bind/zones.rfc1918"8;
zone "teletec.sj.ifsc.edu.br." IN {
        type master;
        file "/etc/bind/teletec.zone";
        allow-update { none; };
};

- Edição do Arquivo de DNS Reverso: /etc/bind/37.135.200.in-addr.arpa

O DNS Reverso resolve um endereço IP para um nome de servidor – por exemplo, ele poderia resolver 200.176.3.142 para exemplo.hipotetico.com.br.

$TTL 86400
@	IN   SOA   www.teletec.sj.ifsc.edu.br. root (
 		2011061500 ;
 		1d ;
 		1h ;
  		1w ; 
		1d ;
 						    )
       IN   NS    www.teletec.sj.ifsc.edu.br.
100    IN   PTR   www.teletec.sj.ifsc.edu.br.

- Edição do Arquivo para criar um subdomínio:/etc/bind/teletec.zone

Arquivo que traz todas as configurações de cada subdomínio.

$TTL	86400
@	IN SOA teletec.teletec.sj.ifsc.edu.br root (
			2011062901;
			3H;
			15M;
			1W;
			1D );
	IN NS		teletec.teletec.sj.ifsc.edu.br.
         IN MX  0        mail.teletec.sj.ifsc.edu.br.
localhost	IN A	127.0.0.1
$ORIGIN teletec.sj.ifsc.edu.br.
teletec		A	200.135.37.100
www		A	200.135.37.100
mail		A	200.135.37.100

- Configuração do servidor Apache

No servidor Apache foi feito a instalação com o comando:

apt-get install apache2

- Configuração do arquivo /etc/apache2/sites-enabled/teletec-default

<VirtualHost *:80>
	ServerAdmin webmaster@localhost
	ServerName www.teletec.sj.ifsc.edu.br
	DocumentRoot /var/www/teletec
	<Directory />
		Options FollowSymLinks
		AllowOverride None
	</Directory>
	<Directory /var/www/teletec>
		Options Indexes FollowSymLinks MultiViews
		AllowOverride None
		Order allow,deny
		allow from all
	</Directory>

	ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
	<Directory "/usr/lib/cgi-bin">
		AllowOverride None
		Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
		Order allow,deny
		Allow from all
	</Directory>

	ErrorLog ${APACHE_LOG_DIR}/error.log

	# Possible values include: debug, info, notice, warn, error, crit,
	# alert, emerg.
	LogLevel warn

	CustomLog ${APACHE_LOG_DIR}/access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

</VirtualHost>

Na criação de um novo cliente vai ser criado um novo arquivo semelhante a esse com duas alterações nas linhas: ServerName www.teletec.sj.ifsc.edu.br onde vai ser acrescentado na frente do domínio o subdomínio do cliente exemplo: ServerName www.subdominio.teletec.sj.ifsc.edu.br e na linha DocumentRoot /var/www/teletec onde vai ser substituido teletec pelo nome do domínio do cliente por exemplo: DocumentRoot /var/www/cliente


- Configuração do servidor POSTFIX

- Primeiro foi feito a instalação com o comando:

apt-get install postfix

Em seguida o programa de instalação vai fazer algumas perguntas sobre a localização dos arquivos e alguns parâmetros

- Configuração do arquivo /etc/postfix/main.cf:


# See /usr/share/postfix/main.cf.dist for a commented, more complete version


# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

myhostname = mail.teletec.sj.ifsc.edu.br
virtual_alias_maps = hash:/etc/postfix/virtual
alias_database = hash:/etc/aliases
myorigin = $myhostname
mydestination = $myhostname, /etc/postfix/mydomains
relayhost = 
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
mydomain = teletec.sj.ifsc.edu.br
mynetworks_style = subnet
virtual_alias_domains = hash:/etc/postfix/mydomains


- Foi criado o arquivo /etc/postfix/virtual

Toda vez que for criado uma nova conta de e-mail vai ser acresentado duas linhas novas nesse arquivo como as que estão em negrito no arquivo abaixo so que onde tem a palavra padrao vai ser substituida pele nome do cliente

teletec.sj.ifsc.edu.br Principal
tecnico@teletec.sj.ifsc.edu.br tecnico

robson.teletec.sj.ifsc.edu.br Subdominio1
robson@robson.teletec.sj.ifsc.edu.br robson

padrao.teletec.sj.ifsc.edu.br padrao
user@padrao.teletec.sj.ifsc.edu.br user

- Editar o arquivo mydomains /etc/postfix/mydomains

Nesse arquivo tem como primeira linha o dominio e na seguinte o subdominio e toda vez que for criado uma conta nova vai ser acresentado uma linha nova com o nome do subdominio do cliente.

teletec.sj.ifsc.edu.br OK
robson.teletec.sj.ifsc.edu.br OK

- Executar os comandos para releitura e reinicialização do Postfix:

postmap /etc/postfix/virtual
postmap /etc/postfix/mydomains
service postfix restart

Instalação de Equipamento de Redes (Modem, Switch e Roteadores)

Configurações:

Instalação:

minicom -s

Configuração do Roteador Cisco 1700:

  • Configuração dos Dois Roteadores Utilizando a ferramenta "Minicon" (Se fosse Windows seria Hyperterminal)
  • Configuração dos dispositivos: Serial e Ethernet
  • Configuração como Protocolo PPP

- "Configuração da porta serial":

┌─────────────[configuração]──────────────┐
│ Nomes de arquivos e rotas
│ Protocolos de transferência de arquivos
│ Configuração da porta serial
│ Modem e discagem
│ Tela e teclado
│ Salvar configuração como dfl
│ Salvar configuração como
│ Sair
│ Sair do Minicom
└────────────────────────────────────────┘

- "Alteração da Porta Serial"

┌──────────────────────────────────────────────────────────┐
│ A – Dispositivo Serial : /dev/ttSy0 
│ B – Localização do Arquivo de Travamento : /var/lock
│ C – Programa de Entrada :
│ D – Programa de Saída :
│ E – Bps/Paridade/Bits : 9600 8N1 
│ F – Controle de Fluxo por Hardware : Não
│ G – Controle de Fluxo por Software : Não
│
│ Alterar qual configuração?
└──────────────────────────────────────────────────────────┘

- "Salvar configuração com dfl"

- Configurando a Interface Serial do Roteador:

enable;
configure terminal;
 
#Para configurar a interface serial:
interface serial 0;
ip address 10.0.0.1/30;
encapsulation ppp;
exit;
 
#Para configurar a interface ethernet:
interface fastethernet 0;
ip address 172.18.0.1/24;
exit;
exit;
 
#Para salvar as configurações:
wr;

Radius

Para ter acesso a rede aDSL ou pela rede sem fio será usado Radius para que os usuários sejam autenticados. O RADIUS é um sistema utilizado para prover uma autenticação centralizada em redes dial-up, VPN's (Virtual Private Network) e redes sem fio. Ele tem um modelo cliente-servidor, onde o cliente é o Network Access Server (NAS). Esse servidor é responsável por obter a informação sobre o cliente e repassá-la para o servidor RADIUS, além de interpretar a resposta, dando ou não acesso ao cliente. O servidor RADIUS é responsável por receber pedidos de conexão, autenticar o usuário e repassar ao NAS as informações necessárias para esse dar acesso ao usuário na rede.

Arquivos configurados:

Configurar login e senha para o cliente Radius ( /etc/freeradius /users ):

“Usúario” Cleartext-Password := "senha"
“Usúario” User-Password := "senha"

Teste antes se seu servidor Radius está autenticando usuáriosfaça o seguinte comando no AC PPPoE (que fica em Ac-server):

radtest seu_usuario sua_senha IP_do_seu_servidor_Radius 1 segredo_do_seu_servidor_Radius

Configurando o Servidor PPPoe (/etc/ppp/pppoe-servers-options):

require-chap
auth
lcp-echo-interval 10
lcp-echo-failure 2
ms-dns IP do seu servidor DNS
netmask 255.255.255.0
noipdefault
debug
kdebug 4
plugin radius.so
plugin radattr.so
radius-config-file /etc/radiusclient/teletec.conf
mru 1492
mtu 1492

Configuração do Cliente Radius ( etc/radiusclient/teletec.conf ):

auth_order	radius
login_tries	4
login_timeout	60
nologin /etc/nologin
issue	/etc/radiusclient/issue
authserver 	200.135.37.100
acctserver 	200.135.37.100
servers		/etc/radiusclient/servers
dictionary 	/etc/radiusclient/dictionary
login_radius	/usr/sbin/login.radius
seqfile		/var/run/radius.seq
mapfile		/etc/radiusclient/port-id-map
default_realm
radius_timeout	10
radius_retries	3
login_local	/bin/login

Configurando o IP do Servidor Radius ( /etc/radiusclient/servers ):

200.135.37.100 testing123

Integrando Radius ao Banco de Dados

Primeiro procedimento, instale o pacote.

apt-get install freeradius-mysql

Edite o arquivo de configuração do freeradius, e descomente a seguinte linha ( /etc/freeradius/radiusd.conf ):

$INCLUDE sql.conf

Para entrar no MySQL execute o comando:

mysql -u root -p 

Crie uma base de dados somente para o Radius e dê ao usuário Radius a devida permissão para acesso a esta base. No shell do MySQL, execute os comandos:

CREATE DATABASE radius;
GRANT ALL ON radius.* TO freerad@localhost IDENTIFIED BY "senha_do_usuário_freeradius";
exit;

Inserindo informações na base de dados:

mysql -u “usuário” -p “senha do usuário radius” “database” < /etc/freeradius/sql/mysql/schema.sql
mysql -u “usuário” -p “senha do usuário radius” “database” < /etc/freeradius/sql/mysql/nas.sql

Editar o arquivo /etc/freeradius/sql.conf, colocando a senha do usuário Radius:

passwrod = "senha do usuário radius"

E descomente a linha do mesmo arquivo ( /etc/freeradius/sql.conf ) :

readclients = yes

Reinicie o FreeRadius:

service freeradius restart

Diagrama-teletec.jpg

Cabeamento Estruturado

Atividades Concluídas:

- o A central telefônica ao DSLAM
- o O DSLAM ao armário de telecom da equipe, através de uma linha telefone + DSL
- o armário da equipe a uma área de trabalho. 
- O cabeamento permitiu a conexão do modem DSL no armário de telecom.
- As tomadas da área de trabalho para conexão com Telefone e o Modem ADSL.

Programação para Redes de Computadores

# Programação PHP e HTML

Os Arquivos PHP (pagina Web) Encontram-se dentro da pasta: /var/www/teletec

Paginas-php-teletec.jpg

- Edição do Arquivo Verificação.php:

Esta pagina PHP verifica se o login e a senha do administrador esta correto. Se estiver correto vai para a pagina "principal.php" se não volta para "login.php".

<?
session_start();
$login = $_POST['login'];
$senha = $_POST['senha'];
if ( ( $login == "LOGIN-DO-ADMIN" ) && ( $senha == "SENHA-DO-ADMIN" ) ){
$_SESSION['autorizado'] = $login;
Header ("Location: principal.php");
}else{
Header ("Location: login.php");
}
?>

- Edição do Arquivo sair.php:

Esta pagina PHP faz o administrador "deslogar" ("logoff") e depois volta para pagina "login.php"

<?
session_start();
session_destroy();
Header ("Location: login.php");
?>

- Edição do arquivo principal.php:

Esta é a principal pagina PHP do site, nela verificamos os clientes criados e armazenados no banco de dados, redirecionamos para pagina que modifica os dominios (alterar.php), redirecionamos para pagina que remover os dominios (excluir.php)e tambem redirecionamos para a pagina que adiciona os dominios (adicionar.php). Quando é redirecionado para pagina de modificação e remoção tambem é enviado uma variavel com o dominio do cliente para saber qual usuario deve ser modificado ou alterado.

<.?
   .session_start();
   .if (!isset($_SESSION['autorizado'])){
      .header ("Location: login.php");
   .}else{
.?>
<.html>
   <.head>
     <.meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
     <.title>Administrcao de Dominios</title>
   <./head>
<.body>

<.p><a href="sair.php">Sair</a>

<.p>

<.p style="text-align:center;margin-left:auto;margin-right:auto;">Cliente Dominio Acao

<.?
   $conexao = mysql_connect("localhost","www-data","SENHA-DO-ADMIN");
   $base_ok = mysql_select_db("teletec",$conexao);
   $consulta = "SELECT * from clientes";
   $resultado = mysql_query($consulta,$conexao);
   while($linha = mysql_fetch_array($resultado)){
      $cliente = $linha['cliente'];
      $dominio = $linha['dominio'];
.?>
   <.form>
      <.p style="text-align:center;margin-left:auto;margin-right:auto;">
      <.a name="cliente" id="cliente" href="alterar.php?id=<? echo $linha['dominio'];?>"> <?echo                   $.linha['cliente'];?></a>   

<.? echo $linha['dominio'];?> <a href="excluir.php?id=<? echo $linha['dominio'];?>"> Excluir</a>

  <./form>
<.?
   .}
   .mysql_free_result($resultado);
   .mysql_close($conexao);
.}
.?>
   <.p style="text-align:right;margin-left:auto;margin-right:0;">

<.a href="adicionar.php">Adicionar novo dominio</a>

<./body>
<./html>

- Edição do Arquivo mod-dominio.php:

Esta pagina PHP recebe três variaveis com o dominio antigo do clinete, o novo dominio e o novo nome do cliente, estas variaveis são repassadas para o script "mod-dominio.sh" e este é executado modificando o dominio e o nome do cliente, depois de executar o script as informações do banco de dados tambem são modificadas e o serviço APACHE2 é reiniciado. Após todo este processamento a pagina é redirecionada para 'principal.php".

<.?
session_start();
if (!isset($_SESSION['autorizado'])){
        header ("Location: login.php");
}else{
   $cliente = $_POST['cliente'];
   $dominio = $_POST['dominio'];
   $antigo = $_POST['antigo'];;
   if (empty($dominio)) {
      $dominio = "invalido";
   } 

   if (preg_match('/^[a-z0-9]+/', $dominio)){
   }else{
      $dominio = "invalido";
   } 

   $arquivo = '/etc/bind/named.conf';
   $linhas = array();
   exec("cat $arquivo",$linhas);
   for ($i = 0 ; $i < sizeof($linhas); $i++){
      if ($linhas[$i] == "include \"/etc/bind/$dominio.conf\";"){
         $dominio = "invalido";
      }
   }
   if ($dominio == "invalido"){
      header ("Location: alterar.php");
   }else{ 

      $script = "sudo /etc/teletec/mod-dominio.sh $antigo '$cliente' $dominio";
      exec("$script");
      exec("/etc/init.d/apache2 restart");

      $conexao = mysql_connect("localhost","www-data","SENHA-DO-ADMIN");
      $base_ok = mysql_select_db("teletec",$conexao);
      $deletar = "DELETE FROM clientes WHERE dominio='$antigo.teletec.sj.ifsc.edu.br'";
      mysql_query($deletar,$conexao);
      mysql_close($conexao); 

      $conexao = mysql_connect("localhost","www-data","SENHA-DO-ADMIN");
      $base_ok = mysql_select_db("teletec",$conexao);
      $inserir = "INSERT INTO clientes (cliente,dominio) VALUES ('$cliente','$dominio.teletec.sj.ifsc.edu.br')";
      mysql_query($inserir,$conexao);
      mysql_close($conexao);
      header ("Location: http://www.teletec.sj.ifsc.edu.br/principal.php"); 

   }
.}
?.>

- Edição do Arquivo login.php:

Esta pagina PHP recolhe o login e a senha fornecidas pelo administrador atraves de um formulario e manda para a pagina PHP de processamento que verifica se esta correto.

.<?
.session_start();
.if (isset($_SESSION['autorizado'])){
.Header ("Location: principal.php");
.}else{
.?>
<.html>
<.head>
  <.meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
  <.title>Hospedagem Web</title>
<./head>

<.body>

<.p>

<.p>Sistemas de Hospedagem de Sitios Web

<.p>

		<.form name="formTeste" action="verificacao.php" method="post">
			<.p>Usuário:
<.input type="text" name="login"> <.p>Senha:
<.input type="password" name="senha"> <.input type="submit" name="b_enviar" value="Entrar"> <./form>

<.p>

<.?
}
.?>
<./body>
<./html>

- Edição do Arquivo Index.php:

Esta pagina apenas redireciona para "login.php"

<.?
Header ("Location: login.php");
.?>

- Edição do Arquivo excluir.php:

Esta pagina PHP faz uma verificação, se o administrador realmente querer excluir o dominio é mandado o dominio do clinete em uma variavel para a pagina PHP de processamento "del-dominio.php" e a pagina é redirecionada para la, mais se o usuario não quiser escluir é mandado novamente para p pagina "principal.php".

<.?
session_start();
if (!isset($_SESSION['autorizado'])){ 
	header ("Location: login.php");
}else{
   $id=$_GET['id'];
   $parte1 = explode(".", $id);
   $antigo = $parte1[0];
?.>
<.html>
   <head>
      <.meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
      <.title>Excluir o cliente</title>
   <./head>
<.body>

<.p>Voce realmente deseja excluir o cliente?

  <.p><a href="del-dominio.php?id=<?echo $antigo;?>">Sim</a> <a

.href="principal.php">Nao</a>

<.p>

<?
}
.?>
<./body>
<./html>

- Edição do Arquivo del-dominio.php:

Esta pagina PHP é uma pagina de processamento que recebe em uma variavel o nome do dominio que sera removido e transfere esta variavel para o script em bash "del-dominio.sh" ja executa o script, depois este dominio é removido do banco de dados e o serviço APACHE2 é reiniciado. Após todo o processamento a pagina é redirecionada para "principal.php".

<.?
session_start();
if (!isset($_SESSION['autorizado'])){
        header ("Location: login.php");
}else{
      $dominio = $_GET['id'];
      $script = "/etc/teletec/del-dominio.sh $dominio";
      exec("$script");
      exec("sudo /etc/init.d/apache2 restart");
      $conexao = mysql_connect("localhost","www-data","SENHA-DO-ADMIN");
      $base_ok = mysql_select_db("teletec",$conexao);
      $deletar = "DELETE FROM clientes WHERE dominio='$dominio.teletec.sj.ifsc.edu.br'";
      mysql_query($deletar,$conexao);
      mysql_close($conexao);
      header ("Location: http://www.teletec.sj.ifsc.edu.br/principal.php");
}
?.>

- Edição do Arquivo alterar.php:

Nesta pagina PHP o administrador informa o novo nome do cliente e o novo dominio, estas informações são gravadas em uma variavel que será mandada para a pagina PHP que vai fazer todo o trabalho de processamento (mod-dominio.php).

<.?
session_start();
if (!isset($_SESSION['autorizado'])){ 
	header ("Location: login.php");
}else{
   $id=$_GET['id'];
   $parte1 = explode(".", $id);
   $antigo = $parte1[0];
?.>
<.html>
   <.head>
      <.meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
      <.title>Alterar Dominio</title>
   </.head>
<.body>

<.p><.a href="principal.php">Voltar </a>

   <.form name="formTeste" action="mod-dominio.php" method="post">
      <.p>Novo nome do cliente: 
<.input type="text" name="cliente"> <.p>Novo dominio:
<.input type="text" name="dominio"> <.input type="hidden" name="antigo" value="<?echo $antigo;?>"> <.input type="submit" name="b_enviar" value="Alterar"> <./form> <.? } ?.> <./body> <./html>

- Edição do Arquivo adicionar.php:

Esta pagina PHP recolhe duas variaveis atraves do formulrios, em uma esta o nome do clinete e na outra o dominio escolhido, estas variaveis são repassadas para a pagina de processamento que vai adicionar este novo subdominio (add-dominio.php).Depois ela é redirecionada para a pagina de processamento "add-dominio.php".

<.?
session_start();
if (!isset($_SESSION['autorizado'])){
	header ("Location: login.php");
.}else{
.?>
<.html>
   <.head>
      <.meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
      <.title>Adicionar Cliente</title>
   <./head>
<.body>

<.p><.a href="principal.php">Voltar </a>

   <.form name="formTeste" action="add-dominio.php" method="post">
      <.p>Nome do cliente: 
<.input type="text" name="cliente"> <.p>Dominio:
<.input type="text" name="dominio"> <.input type="submit" name="b_enviar" value="Criar"> <./form> <.? .} .?> <./body> <./html>

- Edição do Arquivo add-dominio.php:

Esta pagina PHP é uma pagina de processamento que recebe duas variaveis, na primeira esta o nome do dominio que sera removido e na segunda está o dominio do cliente, estas variaveis são transferidas para o script em bash "add-dominio.sh" que é executado, depois este dominio é adicionado no banco de dados e o serviço APACHE2 é reiniciado. Após todo o processamento a pagina é redirecionada para "principal.php".

<.?
session_start();
if (!isset($_SESSION['autorizado'])){
	header ("Location: login.php");
}else{
   $cliente = $_POST['cliente'];
   $dominio = $_POST['dominio']; 

   if (empty($dominio)) {
      $dominio = "invalido";
   } 

   if (preg_match('/^[a-z0-9]+/', $dominio)){
   }else{
      $dominio = "invalido";
   } 

   $arquivo = '/etc/bind/named.conf';
   $linhas = array();
   exec("cat $arquivo",$linhas);
   for ($i = 0 ; $i < sizeof($linhas); $i++){
      if ($linhas[$i] == "include \"/etc/bind/$dominio.conf\";"){
         $dominio = "invalido";
      }
   }
   if ($dominio == "invalido"){
      header ("Location: adicionar.php");
   }else{
      $script = "sudo /etc/teletec/add-dominio.sh '$cliente' $dominio";
      exec("$script");
      exec("/etc/init.d/apache2 restart");
      $conexao = mysql_connect("localhost","www-data","SENHA-DO-ADMIN");
      $base_ok = mysql_select_db("teletec",$conexao);
      $inserir = "INSERT INTO clientes (cliente,dominio) VALUES ('$cliente','$dominio.teletec.sj.ifsc.edu.br')";
      mysql_query($inserir,$conexao);
      mysql_close($conexao);
      header ("Location: http://www.teletec.sj.ifsc.edu.br/principal.php");
   }
}
?.>

# Programação BASH

Os Arquivos .sh (scripts que adicionam, removem ou alteram os usuários no servidor) Encontram-se dentro da pasta: /etc/teletec 

- Edição do Arquivo mod-dominio.sh: Script em bash que altera o dominio do cliente (Subdominio, E-mail e Pagina WEB):

O script de modificação na verdade exclui o dominio criado e cria um novo, os scripts de remover e adicionar estão juntos neste script.

#!/bin/bash
#Leonardo
#echo -n "Dominio: "
#read antigo
#IFS=$'\n'
#for linha in `cat /etc/bind/named.conf`; do
#   if [ $linha = 'include "/etc/bind/'$antigo'.conf";' ];then
#         valido=sim
#         break
#      else
#         valido=nao
#   fi
#done
#if [ $valido = nao ];then
#   echo -e " * Você entrou com um dominio inválido!\t\t\t \e[31m [ ERRO ] \e[m"
#   echo -e " * O dominio não existe ou esta em branco.\n"
#   exit
#fi
#echo -n "Novo nome para o cliente: "
#read nome
#echo -n "Novo dominio: "
#read dominio
#echo=${dominio:=nulo}
#IFS=$'\n'
#for linha in `cat /etc/bind/named.conf`; do
#   if [ $linha = 'include "/etc/bind/'$dominio'.conf";' ];then
#      dominio=existe
#      break
#   fi
#done
#if [ $dominio != nulo ] && [ $dominio != existe ];then
antigo=$1
nome=$2
dominio=$3
      sudo sed -i '/\/etc\/bind\/'$antigo'\.conf/Id' /etc/bind/named.conf
      sudo rm /etc/bind/$antigo.conf
      sudo rm /etc/bind/$antigo.zone
      sudo rm /etc/apache2/sites-enabled/$antigo-default
      sudo rm -r /var/www/$antigo
      sudo sed -i '/'$antigo'\.teletec\.sj\.ifsc\.edu\.br Subdominio-'$antigo'/Id' /etc/postfix/virtual
      sudo sed -i '/'$antigo'@teletec\.sj\.ifsc\.edu\.br '$antigo'/Id' /etc/postfix/virtual
      sudo sed -i '/'$antigo'\.teletec\.sj\.ifsc\.edu\.br OK/Id' /etc/postfix/mydomains 
      sudo userdel -r $antigo 

      sudo echo 'include "/etc/bind/'$dominio'.conf";' >> /etc/bind/named.conf
      numero=`date | cut -d ":" -f 3 | cut -d " " -f 1`
      novoserial=$((1000000000+$numero))
      sudo sed s/padrao/$dominio/g /etc/bind/padrao.conf > /etc/bind/$dominio.conf
      sudo sed s/padrao/$dominio/g /etc/bind/padrao.zone | sed s/2011061504/$novoserial/g > /etc/bind/$dominio.zone
      sudo /etc/init.d/bind9 restart
      sudo sed s/padrao/$dominio/g /etc/apache2/sites-available/padrao-default > /etc/apache2/sites-enabled/$dominio-default
      mkdir /var/www/$dominio
      sed s/dominio/$dominio/g /var/www/padrao/index.html | sed s/nome/"$nome"/g > /var/www/$dominio/index.html
      sudo echo ' ' >> /etc/postfix/virtual
      sudo echo $dominio'.teletec.sj.ifsc.edu.br Subdominio-'$dominio >> /etc/postfix/virtual
      sudo echo $dominio'@teletec.sj.ifsc.edu.br '$dominio >> /etc/postfix/virtual
      sudo echo $dominio'.teletec.sj.ifsc.edu.br OK' >> /etc/postfix/mydomains
      sudo postmap /etc/postfix/virtual
      sudo postmap /etc/postfix/mydomains
      sudo /etc/init.d/postfix restart
#      echo -e " * Dominio modificado com sucesso!\t\t\t\t[ OK ]\n"
#   else
#      echo -e " * Você entrou com um dominio inválido!\t\t\t \e[31m [ ERRO ] \e[m"
#      echo -e " * O dominio ja existe ou esta em branco.\n"
#fi

- Edição do Arquivo del-dominio.sh: Script em bash que remove o cliente (Subdominio, E-mail e Pagina WEB):

Exclui todos os arquivos de configuração criados para este cliente e retira as linhas de configuração adicionadas em arquivos como o "named.conf", "virtual" e "mydomains", por ultimo os serviçoes DNS e POSTFIX são reiniciados ( o APACHE2 é reiniciado na pagina PHP).Também é removido o usuario criado no servidor.

#!/bin/bash
#Leonardo
#echo -n "Dominio: "
#read dominio
#IFS=$'\n'
#for linha in `cat /etc/bind/named.conf`; do
#   if [ $linha = 'include "/etc/bind/'$dominio'.conf";' ];then
dominio=$1
      sudo sed -i '/\/etc\/bind\/'$dominio'\.conf/Id' /etc/bind/named.conf
      sudo rm /etc/bind/$dominio.conf
      sudo rm /etc/bind/$dominio.zone
      sudo /etc/init.d/bind9 restart
      sudo rm /etc/apache2/sites-enabled/$dominio-default
      sudo rm -r /var/www/$dominio
      sudo userdel -r $dominio
      sudo sed -i '/'$dominio'\.teletec\.sj\.ifsc\.edu\.br Subdominio-'$dominio'/Id' /etc/postfix/virtual
      sudo sed -i '/'$dominio'@teletec\.sj\.ifsc\.edu\.br '$dominio'/Id' /etc/postfix/virtual
      sudo sed -i '/'$dominio'\.teletec\.sj\.ifsc\.edu\.br OK/Id' /etc/postfix/mydomains
      sudo postmap /etc/postfix/virtual
      sudo postmap /etc/postfix/mydomains
      sudo /etc/init.d/postfix restart
#      echo -e " * Dominio removido com sucesso!\t\t\t\t[ OK ]\n"
#      exit
#   fi
#done
#      echo -e " * Você entrou com um dominio inválido!\t\t\t \e[31m [ ERRO ] \e[m"
#      echo -e " * O dominio não existe ou esta em branco.\n"

- Edição do Arquivo add-dominio.sh: Script em bash que adiciona o cliente (Subdominio, E-mail e Pagina WEB):

Sub-dominio: O script pega como base arquivos padrões ja criados e configurados ( padrao.conf e padrao.zone ), altera todas as palavras "padrao" destes arvivos pelo dominio escolhido pelo usuario e salva como "dominio-escolhido".zone e "dominio-escolhido".conf. Alem disso ele tambem inclui o caminho do arquivo de configuração ".conf" no "named.conf".

Pagina-Web: Assim como no sub-dominio, o script troca as palavras "padrao" que estão em um arquivo padrao de configuração ( padrao-default) pelo dominio escolhido pelo cliente, criando um novo arquivo de configuração com nome "dominio-escolhido"-default. Tambem cria uma pagina web html padrao.

E-mail: O script adiciona as linhas de configuração do e-mail do cliente nos arquivos "virtual" e "mydomains". Também é criado um usuario no servidor com login e senha igual ao dominio escolhido.

Após fazer as confgurações o script reinicia o DNS e o POSTFIX. (o APACHE2 é reiniciado na pagina PHP).

#!/bin/bash
# Leonardo
#echo -n "Nome do cliente: "
#read nome
#echo -n "Dominio: " 
#read dominio
#echo=${dominio:=nulo}
#IFS=$'\n'
#for linha in `cat /etc/bind/named.conf`; do
#   if [ $linha = 'include "/etc/bind/'$dominio'.conf";' ];then
#      dominio=existe
#      break
#   fi   
#done
#
#if [ $dominio != nulo ] && [ $dominio != existe ];then
nome=$1
dominio=$2
      sudo echo 'include "/etc/bind/'$dominio'.conf";' >> /etc/bind/named.conf
      numero=`date | cut -d ":" -f 3 | cut -d " " -f 1`
      novoserial=$((1000000000+$numero))
      sudo sed s/padrao/$dominio/g /etc/bind/padrao.conf > /etc/bind/$dominio.conf
      sudo sed s/padrao/$dominio/g /etc/bind/padrao.zone | sed s/2011061504/$novoserial/g > /etc/bind/$dominio.zone
      sudo /etc/init.d/bind9 restart
      sudo sed s/padrao/$dominio/g /etc/apache2/sites-available/padrao-default > /etc/apache2/sites-enabled/$dominio-default
      sudo mkdir /var/www/$dominio
      sudo sed s/dominio/$dominio/g /var/www/padrao/index.html | sed s/nome/"$nome"/g > /var/www/$dominio/index.html
      sudo useradd -md /home/$dominio $dominio
      sudo usermod -p $(openssl passwd -1 $dominio) $dominio
      sudo echo ' ' >> /etc/postfix/virtual
      sudo echo $dominio'.teletec.sj.ifsc.edu.br Subdominio-'$dominio >> /etc/postfix/virtual
      sudo echo $dominio'@teletec.sj.ifsc.edu.br '$dominio >> /etc/postfix/virtual 
      sudo echo $dominio'.teletec.sj.ifsc.edu.br OK' >> /etc/postfix/mydomains
      sudo postmap /etc/postfix/virtual
      sudo postmap /etc/postfix/mydomains
      sudo /etc/init.d/postfix restart
#      echo -e " * Dominio criado com sucesso!\t\t\t\t[ OK ]\n"
#   else
#      echo -e " * Você entrou com um dominio inválido!\t\t\t \e[31m [ ERRO ] \e[m"
#      echo -e " * O dominio ja existe ou esta em branco.\n"
#fi

# Banco de dados

Para o administrador conseguir os dados de "nome" e de "dominio" do cliente foi criado uma tabela no banco de dados, estas informações ficam visíveis na pagina "principal.php" e são usadas para remover ou modificar um cliente.

Tabela-teletec.jpg

root@teletec: mysql -u root -p
mysql> create database teletec;
mysql> GRANT ALL PRIVILEGES on teletec.* to 'www-data'@'%' identified by 'SENHA-DO-ADMIN';
mysql> quit
root@teletec: mysql teletec -u www-data -p
mysql> CREATE TABLE clientes (cliente VARCHAR(40), dominio VARCHAR(50));
mysql> quit

# Permissionamento

Um usuário como o "www-data" não tem permissão para usar comandos como "service bind9 restart" ou para criar um arquivo de um diretorio de serviços como o "/etc/bind". Para os scripts em BASH e PHP funcionarem corretamente foi preciso dar permissão para o usuario "www-data" usar alguns comandos como "root", isto foi feito com a edição do arquivo "/etc/sudoers"

- Edição do Arquivo /etc/sudoers: Arquivo onde são especificados os usuários que poderão usar o sudo:

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

#includedir /etc/sudoers.d
www-data ALL=NOPASSWD:/usr/sbin/service, /sbin/restart, /usr/sbin/apache2, /usr/sbin/postfix, 
/etc/init.d/bind9, /bin/sed, /bin/echo, /bin/mkdir, /usr/sbin/postmap, /usr/bin/touch, /etc/teletec
/add-dominio.sh, /etc/init.d/apache2, /etc/init.d/postfix, /bin/rm, /etc/teletec/mod-dominio.sh, 
/etc/teletec/del-dominio.sh, /usr/sbin/useradd, /usr/sbin/usermod, /usr/sbin/userdel