PowerDNS: upgrade fácil de versão
O upgrade de versão do PowerDNS autoritativo exige uma atualização de tabelas e criação de outras. Isso pode não ser uma tarefa simples dependendo do seu ambiente.
Uma das opções que a documentação fala, utilizando o bindbackend (os dados ficam armazenados em arquivos no mesmo formato que ficam no bind) é a criação de uma base específica para os dados de DNSSEC conforme descrito aqui. A parte interessante do PowerDNS é que podemos ter a informação em mais de um lugar, e ligar vários backends ao mesmo tempo. Esses backends normalmente são diferentes uns dos outros, porém podemos utilizar o mesmo backend mais de uma vez. Para isso criamos um apelido para uma das intâncias.
Então, da mesma forma que criamos um backend de banco de dados em cima do bindbackend, podemos criar um backend de banco de dados em cima de outro.
Esta configuração também é muito conveniente para testes, sem estragar o que já está em produção. Mãos à massa
psql
ze=# create database powerdnssec;
ze=# \l powerdnssec
create table domains (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
master VARCHAR(128) DEFAULT NULL,
last_check INT DEFAULT NULL,
type VARCHAR(6) NOT NULL,
notified_serial INT DEFAULT NULL,
account VARCHAR(40) DEFAULT NULL
);
CREATE UNIQUE INDEX name_index ON domains(name);
CREATE TABLE records (
id SERIAL PRIMARY KEY,
domain_id INT DEFAULT NULL,
name VARCHAR(255) DEFAULT NULL,
type VARCHAR(10) DEFAULT NULL,
content VARCHAR(4096) DEFAULT NULL,
ttl INT DEFAULT NULL,
prio INT DEFAULT NULL,
change_date INT DEFAULT NULL,
CONSTRAINT domain_exists
FOREIGN KEY(domain_id) REFERENCES domains(id)
ON DELETE CASCADE
);
CREATE INDEX rec_name_index ON records(name);
CREATE INDEX nametype_index ON records(name,type);
CREATE INDEX domain_id ON records(domain_id);
create table supermasters (
ip VARCHAR(25) NOT NULL,
nameserver VARCHAR(255) NOT NULL,
account VARCHAR(40) DEFAULT NULL
);
GRANT SELECT ON supermasters TO pdns;
GRANT ALL ON domains TO pdns;
GRANT ALL ON domains_id_seq TO pdns;
GRANT ALL ON records TO pdns;
GRANT ALL ON records_id_seq TO pdns;
alter table records add ordername VARCHAR(255);
alter table records add auth bool;
create index orderindex on records(ordername);
create table domainmetadata (
id SERIAL PRIMARY KEY,
domain_id INT REFERENCES domains(id) ON DELETE CASCADE,
kind VARCHAR(16),
content TEXT
);
create table cryptokeys (
id SERIAL PRIMARY KEY,
domain_id INT REFERENCES domains(id) ON DELETE CASCADE,
flags INT NOT NULL,
active BOOL,
content TEXT
);
GRANT ALL ON domainmetadata TO pdns;
GRANT ALL ON domainmetadata_id_seq TO pdns;
GRANT ALL ON cryptokeys TO pdns;
GRANT ALL ON cryptokeys_id_seq TO pdns;
create table tsigkeys (
id SERIAL PRIMARY KEY,
name VARCHAR(255),
algorithm VARCHAR(255),
secret VARCHAR(255)
);
create unique index namealgoindex on tsigkeys(name, algorithm);
GRANT ALL ON tsigkeys TO pdns;
GRANT ALL ON tsigkeys_id_seq TO pdns;
alter table records alter column type type VARCHAR(10);
Assumindo que a base legada se chama powerdns, temos a seguinte configuração
--- /etc/pdns/pdns.conf --- launch=gpgsql,gpgsql:sec gpgsql-user=pdns gpgsql-dbname=powerdns gpgsql-sec-user=pdns gpgsql-sec-dbname=powerdnssec gpgsql-sec-dnssec=yes
Assumindo que já exista o domínio "benetasso.com" dentro da base powerdns, o que precisamos fazer para ter os dados assinados é o seguinte procedimento:
# su - pdns -s /bin/bash
$ psql powerdnssec -c "insert into domains (name, type) values ('benetasso.com', 'NATIVE');"
$ pdnssec set-nsec3 benetasso.com '1 1 1 ab' narrow
$ pdnssec rectify-zone benetasso.com
Pronto! agora só falta publicar a DS:
$ pdnssec show-zone benetasso.com Zone has NARROW hashed NSEC3 semantics, configuration: 1 1 1 ab Zone is not presigned keys: ID = 1 (KSK), tag = 15812, algo = 8, bits = 2048 Active: 1 KSK DNSKEY = benetasso.com IN DNSKEY 257 3 8 AwEAAZSglooxX8aSJvvi/FtLX2A5FZ6FLGQAkcETE3hdLOJG/AWb0/... DS = benetasso.com IN DS 15812 8 1 75ab832514dc25ffdf4791a71c3b371accea8539 DS = benetasso.com IN DS 15812 8 2 7412bdb8d54165453ed9d9e5d91ab8095ab2c3c30309a5dd91c1289ddfc51402 ID = 2 (ZSK), tag = 57109, algo = 8, bits = 1024 Active: 1 ID = 3 (ZSK), tag = 53724, algo = 8, bits = 1024 Active: 0
Posted at 11:23AM Jan 21, 2012 by ze in PowerDNS | Comments[0]
PowerDNS
Uma boa alternativa ao Bind é o PowerDNS.
Trabalhei com ele algum tempo e tenho algum conhecimento sobre este assunto, e espero escrever alguns posts sobre isso.
O foco será alternativas de deploy com DNSSEC habilitado.
Posted at 10:12AM Jan 21, 2012 by ze in PowerDNS | Comments[0]
Montando decks
Depois de muito tempo parado no Magic, arranjei um novo "arqui-inimigo".
Só que a brincadeira ficou um pouco diferente, ele está comprando cartas novas e me obrigando a reformar os meus decks, que eram sub-ótimos (existem cartas melhores para esses decks mas eu não tenho / coloco) para jogar com as pessoas que não compravam mais nada.
Espero não precisar apelar para dual-lands nem as power 9 para ganhar dele, mas a primeira leva de cartas novas deve chegar dos states.
Sites para comprar cartas: Card Kingdom, Star City Games.
Posted at 07:45PM Abr 04, 2011 by ze in Magic | Comments[0]
PostgreSQL 9.0
As features novas mais interessantes pra mim são:
- Hot Stand By
- Complexidade de senhas
Breve posts sobre esses assuntos.
Posted at 11:04PM Set 20, 2010 by ze in Postgresql | Comments[0]
Últimas alterações de uma máquina
Não tem jeito, deixar a máquina desatualizada é perigoso, e atualizar a máquina está sujeito a coisas que funcionavam pararem de funcionar.
A melhor maneira de saber das alterações de um servidor é utilizar um repositório central das coisas instaladas. Esse repositório central em linux existe, é a base RPM. Sempre instale novos programas via rpm e saiba o que acontece em sua máquina.
Atualizações são feitas normalmente via yum, e este também gera log: /var/log/yum.log. Para consultar a base rpm, esse comando resolve:
rpm -qa --queryformat="%{installtime} %{installtime:date} %{name}-%{version}-%{release}\n" | sort -n | less
Posted at 08:05PM Set 18, 2010 by ze in Linux | Comments[0]
Consulta aos arquivos de um pacote rpm
Comandinho que eu utilizo bastante para ver os arquivos de um pacote e outros atributos, como por exemplo ver se o arquivo é de configuração ou documentação, as permissões originais entre outras coisas:
rpm --queryformat="[%{=NAME}-%{=VERSION}-%{=RELEASE}: %{FILEMODES:perms} %{FILEFLAGS:fflags} %{FILENAMES}\n]" \
-q [pacote | -p arquivo.rpm | -f /etc/arquivo/instalado ]
Um exemplo>
rpm --queryformat="[%{=NAME}-%{=VERSION}-%{=RELEASE}: %{FILEMODES:perms} %{FILEFLAGS:fflags} %{FILENAMES}\n]" -q -f /etc/passwd
setup-2.8.20-1.fc13: -rw-r--r-- cn /etc/aliases
setup-2.8.20-1.fc13: -rw-r--r-- cn /etc/bashrc
setup-2.8.20-1.fc13: -rw-r--r-- cn /etc/csh.cshrc
setup-2.8.20-1.fc13: -rw-r--r-- cn /etc/csh.login
setup-2.8.20-1.fc13: -rw-r--r-- cn /etc/environment
setup-2.8.20-1.fc13: -rw-r--r-- cn /etc/exports
setup-2.8.20-1.fc13: -rw-r--r-- cn /etc/filesystems
setup-2.8.20-1.fc13: -rw-r--r-- cmng /etc/fstab
setup-2.8.20-1.fc13: -rw-r--r-- cn /etc/group
setup-2.8.20-1.fc13: ---------- cmn /etc/gshadow
setup-2.8.20-1.fc13: -rw-r--r-- cn /etc/host.conf
setup-2.8.20-1.fc13: -rw-r--r-- cn /etc/hosts
setup-2.8.20-1.fc13: -rw-r--r-- cn /etc/hosts.allow
setup-2.8.20-1.fc13: -rw-r--r-- cn /etc/hosts.deny
setup-2.8.20-1.fc13: -rw-r--r-- cn /etc/inputrc
setup-2.8.20-1.fc13: -rw-r--r-- cn /etc/motd
setup-2.8.20-1.fc13: -rw-r--r-- cmng /etc/mtab
setup-2.8.20-1.fc13: -rw-r--r-- cn /etc/passwd
setup-2.8.20-1.fc13: -rw-r--r-- cn /etc/printcap
setup-2.8.20-1.fc13: -rw-r--r-- cn /etc/profile
setup-2.8.20-1.fc13: drwxr-xr-x /etc/profile.d
setup-2.8.20-1.fc13: -rw-r--r-- cn /etc/protocols
setup-2.8.20-1.fc13: -rw------- cmn /etc/securetty
setup-2.8.20-1.fc13: -rw-r--r-- cn /etc/services
setup-2.8.20-1.fc13: ---------- cmn /etc/shadow
setup-2.8.20-1.fc13: -rw-r--r-- cn /etc/shells
setup-2.8.20-1.fc13: drwxr-xr-x /usr/share/doc/setup-2.8.20
setup-2.8.20-1.fc13: -rw-r--r-- d /usr/share/doc/setup-2.8.20/COPYING
setup-2.8.20-1.fc13: -rw-r--r-- d /usr/share/doc/setup-2.8.20/uidgid
setup-2.8.20-1.fc13: -rw-r--r-- g /var/log/lastlog
A saída: nome do pacote, permissões, atributos, nome do arquivo. Os atributos são:
- c: arquivo de configuração
- d: documentação
- g: ghost (o arquivo não é instalado, mas faz parte do pacote, ex. arquivos de log)
- m: missing ok (se não existir, não mostrar como inconsistência em verificações
- n: no replace; quando instalar uma versão nova, se o arquivo de configuração foi alterado, não sobreescrever
Posted at 11:21PM Ago 25, 2010 by ze in Linux | Comments[0]
Adeus Firefox
Quem me conhece há muito tempo conhece minha preferência por processos ao invés de threads, basicamente pelo maior isolamento.
O maior motivo de eu ainda continuar com o Firefox ao invés do Google Chrome, já que ele usa processos ao invés de threads é a maneira com que ele salva as senhas no sistema de arquivos, de maneira insegura. É um pouco de paranóia minha, mas precaução moderadas não fazem mal nenhum.
Felizmente nas últimas versões a kwallet já é suportada! O que fica faltando é importar algumas senhas já salvas (não rolou automaticamente).
Outro plus pro chorme: o inspect dele já imbutido supre todas as minhas necessidades do Firebug. Agora são só detalhes: delicious, adblock, essas coisas.
A coisa mais irritante do Firefox na verdade é a fragmentação da memória, que faz parecer que ele tem vários memory leaks.
Posted at 10:46PM Jul 18, 2010 by ze in General | Comments[0]
Clip - Du Riechst so gut
Clip do Rammstein. Essa é a versão boa, prefiro nem colocar a versão 95 do clip, que é totalmente baitolagem!
Posted at 01:25PM Jul 11, 2010 by ze in Music | Comments[0]
O melhor AMV que eu vi no youtube
Pra quem não sabe, AMV: Anime Music Video.
Fear Factory é uma banda de poucos hits, mas marcou época pelo estilo industrial, que estragaram no New Metal.
Para o clip, o Clássico Ghost in the Shell, uma das influências de Matrix.
Posted at 11:57PM Jun 30, 2010 by ze in Music | Comments[0]
Slony para os preguiçosos
Encontrei alguns tutoriais para configurar a replicação Master / Slave do PostgreSQL com Slony, mas todas elas eram relativamente grandes e cheias de conceitos.
Esse post pretende ser o mais enxuto possível sem explicar os detalhes. Estou assumindo que a instalação seja de gente grande, com SSL ligado e instalado via pacote RPM (eu criei baseado no spec que vem no pacote, mas tive que fazer algumas adaptações).
O que será replicado
Base de dados: base1
Tabelas: tabela1, tabela2
Em cada máquina
psql -c "create user elefante superuser password 'senha';"
psql base1 -c "create language plpgsql;"
Configurando a replicação
Arquivo /etc/slon_tools.conf (em uma das máquinas):
if ($ENV{"SLONYNODES"}) {
require $ENV{"SLONYNODES"};
} else {
# nome qualquer para o cluster de replicacao. Usado no daemon
$CLUSTER_NAME = 'replication';
$LOGDIR = '/var/log/slony1';
$MASTERNODE = 1;
$DEBUGLEVEL = 2;
# Nos do cluster. Novos nos devem ser adicionados aqui. Nao mudar o node nunca
add_node(node => 1,
host => '172.16.0.2',
dbname => 'base1',
port => 5432,
user => 'elefante',
password => 'senha',
sslmode => 'require');
add_node(node => 2,
host => '172.16.0.3',
dbname => 'base1',
port => 5432,
user => 'elefante',
password => 'senha',
sslmode => 'require');
}
$SLONY_SETS = {
"set1" => {
# id a ser passado nos comandos do slonik
"set_id" => 1,
# replicar tabelas e sequencias
"table_id" => 1,
"sequence_id" => 1,
"pkeyedtables" => [
'tabela1',
'tabela2',
],
"sequences" => ['tabela1_id_seq',
'tabela2_id_seq',
],
},
};
if ($ENV{"SLONYSET"}) {
require $ENV{"SLONYSET"};
}
1;
/etc/slon.conf - configuração do daemon que fará a replicação (em cada máquina)
cluster_name='replication'
conn_info='host=172.16.0.2 dbname=base1 user=elefante port=5432 password=senha sslmode=require'
Ligando a replicação
slonik <(slonik_init_cluster)
service slon start
# iniciar o slon nos slaves também
slonik <(slonik_create_set 1)
slonik <(slonik_subscribe_set 1 2)
*Tudo* isso é o suficiente para ter uma base slave com os dados das duas tabelas no master.
Posted at 10:40AM Mai 02, 2010 by ze in Postgresql | Comments[0]


