Tuesday 21 August 2012

PowerDNS


PowerDNS는 Authoritative Server와 Recursive Server로 구분하여 제공한다.
  • Authoritative Server
    Authoritative Server 는 자신이 관리하는 도메인 정보를 관리한다.
    만일 DNS 질의가 들어올 경우 자신이 관리하는 도메인 정보일 경우 그 요청에 대한 응답을 제공하며, 그 외의 질의는 응답하지 않는다. 
  • Recursive Server
    Recursive Server는 루트(.) 네임서버의 정보를 통해 각 도메인을 관리하는 DNS 서버들에게 질의하여 해당 호스트의 IP를 알아내는 기능을 한다. 이 때 질의 응답은 당연히 Recursive Server가 하는 것이 아니라 해당 영역의 DNS 서버가 주게 된다. 

PowerDNS Authoritative & recursor 서버 설치

  1. PowerDNS Yum Repository 등록
  2. PowerDNS 설치
    # yum install -y pdns-server
    # yum install -y pdns-recursor pdns-recursor-rrd --skip-broken
    # yum install -y mysql-server pdns-server-backend-mysql pdns-server-tools
    skip-broken
    PDNS-RECURSOR 설치 시 EPEL 저장소와 pdns-recursor-MIND 저장소가 같은 이름의 패키지를 가지고 있음으로 --skip-broken을 사용하여 에러를 무시하고 pdns-recursor-MIND 저장소 패키지를 설치하도록 하였음

Authoritative Server Configuration

  1. MySQL Database 설치
    # yum install mysql mysql-server -y
    # mysql_install_db
    # service mysqld start
    # mysqladmin -u root password '<암호>'
  2. PowerDNS Database 설정
    1. Database 및 User 생성
      mysql> CREATE DATABASE powerdns character set utf8;
      mysql> GRANT ALL ON powerdns.* TO 'poweradmin'@'localhost' IDENTIFIED BY '*******';
      mysql> FLUSH PRIVILEGES;
      주의
      DNSSEC 활성화시키려 한다면 powerdns 데이터베이스의 Character set을 latin1으로 반드시 설정한다.
    2. Tables 생성
      USE powerdns;
       
      create table domains (
       id      INT auto_increment,
       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,
       primary key (id)
      ) Engine=InnoDB;
       
      CREATE UNIQUE INDEX name_index ON domains(name);
       
      CREATE TABLE records (
        id              INT auto_increment,
        domain_id       INT DEFAULT NULL,
        name            VARCHAR(255) DEFAULT NULL,
        type            VARCHAR(10) DEFAULT NULL,
        content         VARCHAR(255) DEFAULT NULL,
        ttl             INT DEFAULT NULL,
        prio            INT DEFAULT NULL,
        change_date     INT DEFAULT NULL,
        primary key(id),
        CONSTRAINT `records_ibfk_1` FOREIGN KEY (`domain_id`) REFERENCES `domains`
      (`id`) ON DELETE CASCADE
      )Engine=InnoDB;
       
      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
      ) Engine=InnoDB;
       
      GRANT SELECT ON supermasters TO pdns;
      GRANT ALL ON domains TO pdns;
      GRANT ALL ON records TO pdns;
    3. DNSSEC
      create table domainmetadata (
          id INT auto_increment ,
          domain_id INT NOT NULL ,
          kind VARCHAR(16),
          content TEXT ,
          primary key(id )
      );
      create table cryptokeys (
          id INT auto_increment ,
          domain_id INT NOT NULL ,
          flags INT NOT NULL ,
          active BOOL ,
          content TEXT ,
          primary key(id )
      );
       
      alter table records add ordername VARCHAR(255);
      alter table records add auth bool ;
      create index orderindex on records(ordername);
       
      create table tsigkeys (
          id INT auto_increment ,
          name VARCHAR(255),
          algorithm VARCHAR(255),
          secret VARCHAR(255),
          primary key(id )
      );
       
      create unique index namealgoindex on tsigkeys ( name, algorithm );
       
      alter table records change column type type VARCHAR(10);
  3. PowerDNS Authoritative Server 설정 파일 수정
    # vi /etc/powerdns/pdns.conf
    # Daemon Settings
    daemon=yes
    guardian=yes
    local-address=<서버 IP>
    
    # Recursor Settings
    lazy-recursion=yes
    recursor=127.0.0.1
    
    # MySQL Backend Setting
    launch=gmysql
    gmysql-host=127.0.0.1
    gmysql-port=3306
    gmysql-dbname=powerdns
    gmysql-user=poweradmin
    gmysql-password=<암호>
    

Recursor Server Configuration

  • PowerDNS Recursor Server 설정 파일 수정
    # vi /etc/pdns-recursor/recursor.conf
    # Daemon Settings
    allow-from=127.0.0.0/8, 10.0.0.0/8, 192.168.0.0/16, ::1/128, fe80::/10
    local-address=127.0.0.1
    quiet=yes
    

PowerDNS 서비스 등록 및 실행

# chkconfig pdns on
# chkconfig pdns-recursor on
# service pdns start
# service pdns-recursor start

PowerDNS 기타 설정

    1. Webserver
      PowerDNS는 현재 서비스 상태를 볼 수 있도록 웹 UI를 제공한다. 기본적으로 127.0.0.1 주소로만 개방되어있으며 암호가 Plain Text 방식이므로 보안에 취약할 수 있으므로 가급적 사용을 자제한다.
      다음은 서버의 모든 IP에 서비스를 Binding 시키는 예제이다.
      # vi /etc/pdns/pdns.conf
      webserver
      webserver-address=0.0.0.0
      webserver-password=<암호>
      
      기본적으로 8081 포트로 서비스가 Binding되어있다.
    2. Logging
      # vi /etc/pdns/pdns.conf
      logging-facility=0
      
      # vi /etc/rsyslog.conf
      # Save PowerDNS messages also to pdns.info, pdns.warn, pdns.err
      local0.info                                              -/var/log/pdns/pdns.info
      local0.warn                                              -/var/log/pdns/pdns.warn
      local0.err                                               /var/log/pdns/pdns.err
      
      # service rsyslog restart
    3. Security
      PowerDNS의 보안성을 강화시키기 위해 chroot 옵션을 설정한다.
      chroot=/var/spool/powerdns
      
      # mkdir /var/spool/powerdns
      # chown powerdns:powerdns /var/spool/powerdns

No comments:

Post a Comment