Skip to content

Commit 6863f32

Browse files
author
Till Brehm
committed
Reimplemented DNSSEC signing.
1 parent 906eaa1 commit 6863f32

File tree

6 files changed

+25
-13
lines changed

6 files changed

+25
-13
lines changed

install/sql/incremental/upd_dev_collection.sql

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,6 @@ ALTER TABLE `client` CHANGE `id_rsa` `id_rsa` TEXT CHARACTER SET utf8 COLLATE ut
6666
ALTER TABLE `directive_snippets` ADD `update_sites` ENUM('y','n') NOT NULL DEFAULT 'n' ;
6767

6868
-- Add DNSSEC Algorithm setting
69-
ALTER TABLE `dns_soa` ADD `dnssec_algo` ENUM('sha1','sha256') NULL DEFAULT NULL AFTER `dnssec_wanted`;
70-
UPDATE `dns_soa` SET `dnssec_algo` = 'sha1' WHERE `dnssec_algo` IS NULL;
71-
ALTER TABLE `dns_soa` CHANGE `dnssec_algo` `dnssec_algo` ENUM('sha1','sha256') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'sha256';
69+
ALTER TABLE `dns_soa` ADD `dnssec_algo` SET('NSEC3RSASHA1','ECDSAP256SHA256') NULL DEFAULT NULL AFTER `dnssec_wanted`;
70+
UPDATE `dns_soa` SET `dnssec_algo` = 'NSEC3RSASHA1' WHERE `dnssec_algo` IS NULL;
71+
ALTER TABLE `dns_soa` CHANGE `dnssec_algo` `dnssec_algo` SET('NSEC3RSASHA1','ECDSAP256SHA256') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'ECDSAP256SHA256';

install/sql/ispconfig3.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -626,7 +626,7 @@ CREATE TABLE `dns_soa` (
626626
`update_acl` varchar(255) default NULL,
627627
`dnssec_initialized` ENUM('Y','N') NOT NULL DEFAULT 'N',
628628
`dnssec_wanted` ENUM('Y','N') NOT NULL DEFAULT 'N',
629-
`dnssec_algo` ENUM('sha1','sha256') NOT NULL DEFAULT 'sha256',
629+
`dnssec_algo` SET('NSEC3RSASHA1','ECDSAP256SHA256') NOT NULL DEFAULT 'ECDSAP256SHA256',
630630
`dnssec_last_signed` BIGINT NOT NULL DEFAULT '0',
631631
`dnssec_info` TEXT NULL,
632632
PRIMARY KEY (`id`),

interface/web/dns/dns_soa_edit.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,8 @@ function onSubmit() {
296296

297297
$this->dataRecord["xfer"] = preg_replace('/\s+/', '', $this->dataRecord["xfer"]);
298298
$this->dataRecord["also_notify"] = preg_replace('/\s+/', '', $this->dataRecord["also_notify"]);
299+
300+
if(isset($this->dataRecord['dnssec_wanted']) && $this->dataRecord['dnssec_wanted'] == 'Y' && $this->dataRecord['dnssec_algo'] == '') $this->dataRecord['dnssec_algo'] = 'ECDSAP256SHA256';
299301

300302
//* Check if a secondary zone with the same name already exists
301303
$tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_slave WHERE origin = ? AND server_id = ?", $this->dataRecord["origin"], $this->dataRecord["server_id"]);

interface/web/dns/dns_wizard.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@
339339
$section = '';
340340
$vars = array();
341341
$vars['xfer']='';
342-
$vars['dnssec_algo']='sha256';
342+
$vars['dnssec_algo']='ECDSAP256SHA256';
343343
$dns_rr = array();
344344
foreach($tpl_rows as $row) {
345345
$row = trim($row);

interface/web/dns/form/dns_soa.tform.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -278,9 +278,10 @@
278278
),
279279
'dnssec_algo' => array (
280280
'datatype' => 'VARCHAR',
281-
'formtype' => 'SELECT',
282-
'default' => 'sha256',
283-
'value' => array('sha1' => 'SHA1','sha256' => 'SHA256'),
281+
'formtype' => 'CHECKBOXARRAY',
282+
'separator' => ',',
283+
'default' => 'ECDSAP256SHA256',
284+
'value' => array('NSEC3RSASHA1' => '7 (NSEC3RSASHA1)','ECDSAP256SHA256' => '13 (ECDSAP256SHA256)'),
284285
'width' => '30',
285286
'maxlength' => '255'
286287
),

server/plugins-available/bind_plugin.inc.php

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,14 @@ function soa_dnssec_create(&$data) {
110110
}
111111
}
112112

113+
// Get DNSSEC Algorithms
114+
$dnssec_algo = explode(',',$data['new']['dnssec_algo']);
115+
113116
//Do some magic...
114-
if($data['new']['dnssec_algo'] == 'sha256') {
117+
if(in_array('ECDSAP256SHA256',$dnssec_algo)) {
115118
$app->system->exec_safe('cd ?; dnssec-keygen -3 -a ECDSAP256SHA256 -n ZONE ?; dnssec-keygen -f KSK -3 -a ECDSAP256SHA256 -n ZONE ?', $dns_config['bind_zonefiles_dir'], $domain, $domain);
116-
} else {
119+
}
120+
if(in_array('NSEC3RSASHA1',$dnssec_algo)) {
117121
$app->system->exec_safe('cd ?; dnssec-keygen -a NSEC3RSASHA1 -b 2048 -n ZONE ?; dnssec-keygen -f KSK -a NSEC3RSASHA1 -b 4096 -n ZONE ?', $dns_config['bind_zonefiles_dir'], $domain, $domain);
118122
}
119123

@@ -141,7 +145,10 @@ function soa_dnssec_sign(&$data) {
141145
if (!preg_match('@'.preg_quote($includeline).'@', $zonefile)) $zonefile .= "\n".$includeline."\n";
142146
$keycount++;
143147
}
144-
if ($keycount != 2) $app->log('DNSSEC Warning: There are more or less than 2 keyfiles for zone '.$domain, LOGLEVEL_WARN);
148+
149+
$keycount_wanted = count(explode(',',$data['new']['dnssec_algo']))*2;
150+
151+
if ($keycount != $keycount_wanted) $app->log('DNSSEC Warning: There are more or less than 2 keyfiles for each algorithm for zone '.$domain, LOGLEVEL_WARN);
145152
file_put_contents($dns_config['bind_zonefiles_dir'].'/'.$filespre.$domain, $zonefile);
146153

147154
//Sign the zone and set it valid for max. 16 days
@@ -309,9 +316,11 @@ function soa_update($event_name, $data) {
309316
}
310317

311318
//* DNSSEC-Implementation
312-
if($data['old']['origin'] != $data['new']['origin'] || $data['old']['dnssec_algo'] != $data['new']['dnssec_algo']) {
319+
if($data['old']['origin'] != $data['new']['origin']) {
313320
if (@$data['old']['dnssec_initialized'] == 'Y' && strlen(@$data['old']['origin']) > 3) $this->soa_dnssec_delete($data); //delete old keys
314-
if ($data['new']['dnssec_wanted'] == 'Y') $this->soa_dnssec_create($data);
321+
if ($data['new']['dnssec_wanted'] == 'Y') $this->soa_dnssec_create($data);
322+
} elseif($data['old']['dnssec_algo'] != $data['new']['dnssec_algo']) {
323+
if ($data['new']['dnssec_wanted'] == 'Y') $this->soa_dnssec_create($data);
315324
} elseif ($data['new']['dnssec_wanted'] == 'Y' && $data['old']['dnssec_initialized'] == 'N') {
316325
$this->soa_dnssec_create($data);
317326
} elseif ($data['new']['dnssec_wanted'] == 'N' && $data['old']['dnssec_initialized'] == 'Y') { //delete old signed file if dnssec is no longer wanted

0 commit comments

Comments
 (0)