HP TCP/IP Services for OpenVMS
Management
6.1.2.3 Caching-Only Servers
Caching-only servers get the answers to all name service queries from
other name servers. Once a caching server receives an answer to a
query, it saves the information and uses it in the future to answer
queries itself. Most name servers cache answers and use them in this
way but a caching-only server depends on this for all its server
information. It does not keep name server database files as other
servers do. Caching-only servers are nonauthoritative,
which means that their information is secondhand and can be incomplete.
Caching-only servers require a hint file and loopback files.
6.1.2.4 Forwarder Servers
The forwarding facility can be used to create a large, sitewide cache
on a few servers, thereby reducing traffic over links to external name
servers. Forwarder servers process requests that slave servers cannot
resolve locally (for example, because they do not have access to the
Internet).
Forwarding occurs on only those queries for which the server is not
authoritative and for which it does not have the answer in its cache.
A master or slave server specifies a particular host to which requests
outside the local zone are sent. This is a form of Internet courtesy
that limits the number of hosts that actually communicate with the root
servers listed in the ROOT.HINT file.
If you configure a forwarder server, you must provide the name of the
host to which requests outside your zones of authority are forwarded.
6.2 Security Considerations
BIND Version 9 provides the following security enhancements:
- Access control lists allow you to control access to the name
server. See Section 6.2.1 for more information.
- Dynamic Update Security controls access to the dynamic update
facility. See Section 6.2.2 for more information.
- Transaction Signatures (TSIG) provide key-based access to the
dynamic update facility. See Section 6.2.3 for more information.
- TKEY automatically generates a shared secret between two hosts.
See Section 6.2.4 for more information.
- SIG(0) is another method for signing transactions. See
Section 6.2.5 for more information.
- DNSSEC provides cryptographic authentication of DNS information.
See Section 6.2.6 for more information.
6.2.1 Access Control Lists
Access control lists (ACLs) are address match lists that you can set up
and name for use in configuring the following options:
-
allow-notify
-
allow-query
-
allow-recursion
-
blackhole
-
allow-transfer
Using ACLs, you can control who can access your name server without
cluttering your configuration files with huge lists of IP addresses.
It is a good idea to use ACLs and to control access to your server.
Limiting access to your server by outside parties can help prevent
unwanted use of your server.
Here is an example of how to apply ACLs properly:
// Set up an ACL named "bogusnets" that will block RFC1918 space,
// which is commonly used in spoofing attacks.
acl bogusnets { 0.0.0.0/8; 1.0.0.0/8; 2.0.0.0/8; 192.0.2.0/24;
224.0.0.0/3; 10.0.0.0/8; 172.16.0.0/12; 192.168.0.0/16;
};
// Set up an ACL called our-nets. Replace this with the real IP numbers.
acl our-nets { x.x.x.x/24; x.x.x.x/21; };
options {
...
...
allow-query { our-nets; };
allow-recursion { our-nets; };
...
blackhole { bogusnets; };
...
};
zone "example.com" {
type master;
file "example_com.db";
allow-query { any; };
};
|
This example allows recursive queries of the server from the outside,
unless recursion has been previously disabled. For more information
about how to use ACLs to protect your server, see Section 6.5.2.
6.2.2 Dynamic Update Security
Access to the dynamic update facility should be strictly limited. In
earlier versions of BIND, the only way to do this was to include an IP
address or network prefix in the
allow-update
zone option. This method is insecure because the source address of the
update UDP packet is easily forged. Also, if the IP addresses allowed
by the
allow-update
option include the address of a slave server that performs forwarding
of dynamic updates, the master can be trivially attacked by sending the
update to the slave, which will forward it to the master with its own
source IP address. This causes the master to approve the update without
question.
For these reasons, updates should be authenticated cryptographically by
means of transaction signatures (TSIG). That is, the
allow-update
option should list only TSIG key names, not IP addresses or network
prefixes. Alternatively, you can use the new
update-policy
option.
Some sites choose to keep all dynamically updated DNS data in a
subdomain and to delegate that subdomain to a separate zone. This way,
the top-level zone containing critical data, such as the IP addresses
of public web and mail servers, need not allow dynamic updates at all.
For information about setting up dynamic updates, see Section 6.5.7.
6.2.3 TSIG
This section describes how to set up Transaction Signatures (TSIG)
transaction security in BIND. It describes changes to the configuration
file as well as the changes that are required for different features,
including the process of creating transaction keys and how to use
transaction signatures with BIND.
BIND primarily supports TSIG for server-to-server communication. This
includes zone transfer, notify, and recursive query messages.
TSIG is useful for dynamic updating. A primary server for a dynamic
zone should use access control to control updates, but IP-based access
control is insufficient. The cryptographic access control provided by
TSIG is far superior. To use TSIG with the
nsupdate
utility, specify either the
-k
or
-y
option on the NSUPDATE command line. For more information about using
the
nsupdate
utility, see Section 6.5.7.3.
Use the following procedure to implement TSIG:
- Generate shared keys for each pair of hosts.
You can generate
shared keys automatically, or you can specify them manually. In the
example that follows, a shared secret is generated to be shared between
HOST1 and HOST2. The key name is
host1-host2
. The key name must be the same on both hosts.
Longer keys are
better, but shorter keys are easier to read. The maximum key length is
512 bits; keys longer than that will be digested with MD5 to produce a
128-bit key. Use the
dnssec-keygen
utility to generate keys automatically.
The following command
generates a 128-bit (16-byte) HMAC-MD5 key:
$ dnssec_keygen -a hmac-md5 -b 128 -n HOST host1-host2.
|
In this example, the key is in the file
KHOST1-HOST2.157-00000_PRIVATE. Nothing uses this file directly, but
the base-64 encoded string following
Key:
can be extracted from the file and can be used as a shared secret. For
example:
Key: La/E5CjG9O+os1jq0a2jdA==
|
The string
La/E5CjG9O+os1jq0a2jdA==
can be used as the shared secret.
Keys can also be specified
manually. The shared secret is a random sequence of bits, encoded in
base-64. Most ASCII strings are valid base-64 strings (assuming the
length is a multiple of 4 and that only valid characters are used).
- Copy the shared secret to both hosts.
Use a secure transport
mechanism like a floppy disk, or a physically secure network, to copy
the shared secret between hosts.
- Inform the servers of the key's existence.
In the following
example, HOST1 and HOST2 are both servers. Add the following to each
server's TCPIP$BIND.CONF file:
key host1-host2. {
algorithm hmac-md5;
secret "La/E5CjG9O+os1jq0a2jdA==";
};
|
The HMAC-MD5 algorithm is the only one supported by BIND. It is
recommended that either TCPIP$BIND.CONF not be world readable, or that
the
key
statement be added to a nonworld readable file that is included by
TCPIP$BIND.CONF. For information about the
key
statement, see Section 6.5.3.4.
Once the configuration file is
reloaded, the key is recognized. This means that if the server receives
a message signed by this key, it can verify the signature. If the
signature is successfully verified, the response is signed by the same
key.
- Instruct the server to use the key.
Because keys are shared
only between two hosts, the server must be told when keys are to be
used. Add the following to the TCPIP$BIND.CONF file for HOST1. The IP
address of HOST2 is 10.1.2.3.
server 10.1.2.3 {
keys { host1-host2. ;};
};
|
Multiple keys can be present, but only the first is used. This
statement does not contain any secrets, so you can include it in a
world-readable file.
If HOST1 sends a message that is a request to
that address, the message will be signed with the specified key. HOST1
will expect any responses to signed messages to be signed with the same
key.
A similar statement must be present in HOST2's configuration
file (with HOST1's address) for HOST2 to sign request messages to HOST1.
- Implement TSIG key-based access control.
You can specify TSIG
keys in ACL definitions and in the following configuration options:
-
allow-query
-
allow-transfer
-
allow-update
For the key named HOST1-HOST2., specify the following
allow-update
option:
allow-update { key host1-host2. ;};
|
This statement allows dynamic updates to succeed only if the
request was signed by a key named HOST1-HOST2.
- Reload the configuration file.
Changes to the configuration
file will not take effect until the configuration file is reloaded. You
can use one of several methods to reload the configuration file:
- The
rndc
utility
- The TCP/IP management command SET NAME/INITIALIZE
- Stopping and restarting the BIND server
- Handle any errors.
The processing of TSIG-signed messages can
result in several types of errors. If a signed message is sent to a
non-TSIG aware server, an error is returned because the server will not
understand the record. This is a result of misconfiguration; the server
must be configured explicitly to send a TSIG-signed message to a
specific server.
If a TSIG-aware server receives a message signed
by an unknown key, the response is unsigned and an error is returned.
If a TSIG-aware server receives a message with a signature that is
not validated, the response is unsigned and an error is returned.
If a TSIG aware server receives a message with a time outside of
the allowed range, the response is signed, an error is returned, and
the time values are adjusted so that the response can be successfully
verified.
6.2.4 TKEY
TKEY is a mechanism for automatically generating a shared secret
between two hosts. There are several modes of TKEY that specify how the
key is generated or assigned. BIND implements only the Diffie-Hellman
key exchange. Both hosts are required to have a Diffie-Hellman KEY
record (although this record is not required to be present in a zone).
The TKEY process must use messages signed either by TSIG or SIG(0). The
result of TKEY is a shared secret that can be used to sign messages
with TSIG. TKEY can also be used to delete shared secrets that it had
previously generated.
The TKEY process is initiated by a client or server by sending a signed
TKEY query (including any appropriate KEYs) to a TKEY-aware server. The
server response, if it indicates success, contains a TKEY record and
any appropriate keys. After this exchange, both participants have
enough information to determine the shared secret. When Diffie-Hellman
keys are exchanged, the shared secret is derived by both participants.
6.2.5 SIG(0)
BIND 9 partially supports DNSSEC SIG(0) transaction signatures as
specified in RFC 2535 and RFC2931.
SIG(0) uses public and private keys to authenticate messages. Access
control is performed in the same manner as TSIG keys; privileges can be
granted or denied based on the key name. When a SIG(0) signed message
is received, it is verified only if the key is known and trusted by the
server; the server does not attempt to locate and validate the key.
SIG(0) signing of multiple-message TCP streams is not supported. The
only tool shipped with BIND Version 9 that generates SIG(0) signed
messages is nsupdate.
6.2.6 DNSSEC
Cryptographic authentication of DNS information is implemented using
the DNS Security (DNSSEC) extensions (defined in RFC's 4033, 4034,
4035).
BIND Version 9 provides several tools that are used in the process of
creating and using DNSSEC signed zones. These tools include:
- The
dnssec_keygen utility
, which generates keys for DNSSEC (secure DNS) and TSIG (transaction
signatures).
- The
dnssec_signzone
utility, which signs a zone and produces keyset and dsset files.
For detailed information about these utilities, see Section 6.10. In
all cases, the
-h
option displays a full list of parameters. Note that the DNSSEC tools
require the
keyset
files to be in the working directory.
Note
The tools shipped with TCP/IP Services V5.5 and earlier are not
compatible with the current ones.
|
There must be communication with the administrators of the parent
and/or child zone to transmit keys. A zone's security status must be
indicated by the parent zone for a DNSSEC-capable resolver to trust its
data. This is done through the presence or absence of a DS record at
the delegation
For other servers to trust data in this zone, they must be statically
configured either with this zone's zone key or with the zone key of
another zone above this one in the DNS tree.
Use the following procedure to set up DNSSEC secure zones:
- Generate keys.
To generate keys, use the
dnssec_keygen
program.
A secure zone must contain one or more zone keys. The zone
keys sign all other records in the zone, as well as the zone keys of
any secure delegated zones. Zone keys must have the same name as the
zone, must have a name type of ZONE, and must be usable for
authentication.
The following command generates a 768-bit DSA key
for the
child.example
zone:
$ $ dnssec_keygen -a DSA -b 768 -n ZONE child.example.
|
Two output files are produced: KCHILD_EXAMPLE.003-12345_KEY and
KCHILD_EXAMPLE.003-12345_PRIVATE (where 12345 is the key tag). The key
file names contain the key name (
child_example.
), the algorithm (3 is DSA, 1 is RSAMD5, 5 is RSASHA1), and the key tag
(12345, in this case). The private key (in the _PRIVATE file) is used
to generate signatures, and the public key (in the _KEY file) is used
to verify signatures.
To generate another key with the same
properties (but with a different key tag), repeat the preceding
command.
It is good practice to use zone-signing keys (ZSK) as well
as key-signing keys (KSK). The key-signing keys are usually the first
keys from your zone that are used to build a chain of authority to the
data that needs to be validated. Therefore, these keys are often called
a secure entry point (SEP) key. These SEP keys are the ones that you
should exchange with your parents or that verifying resolvers configure
as their trust anchors. Create keys with the SEP bit set by specifying
the
-f KSK
flag:
$dnssec_keygen -f KSK -a RSASHA1 -b 768 -n ZONE child.example
|
Insert the public ZSK and KSK keys into the zone file using
$INCLUDE
statements that specify the _KEY files. For example, in the
ZONE_CHILD_EXAMPLE.DB
file add the following two lines:
$INCLUDE KCHILD_EXAMPLE.005-39677_KEY
$INCULDE KCHILD_EXAMPLE.005-39678_KEY
|
where
KCHILD_EXAMPLE.005-39677_KEY
is the public file containing the ZSK and
KCHILD_EXAMPLE.005-39678_KEY
is the public file containing the KSK.
- Sign the zone.
To sign a zone, use the
dnssec_signzone
utility.
Any keyset files corresponding to secure subzones should
be present. The zone signer will generate NSEC and RRSIG records for
the zone, as well as DS for the child zones if
-d
is specified. If
-d
is not specified then DS RRsets for the secure child zones need to be
added manually.
The following command signs the zone, assuming it
is in a file called ZONE_CHILD_EXAMPLE.DB.
$ dnssec_signzone -o child.example -k KCHILD_EXAMPLE.005-39678_KEY
ZONE_CHILD_EXAMPLE.DB KCHILD_EXAMPLE.005-39677_KEY
|
Above,
-o
specifies the zone origin,
-k
specifies the file containing the KSK, followed by the name of the zone
database, then the file containing the ZSK.
One output file is
produced: ZONE_CHILD_EXAMPLE.DB_SIGNED. This file should be referenced
by TCPIP$BIND.CONF as the input file for the zone.
dnssec_signzone
will also produce a keyset and dsset files and optionally a dlvset
file. These are used to provide the parent zone administrators with the
DNSKEYs (or their corresponding DS records) that are the secure entry
point to the zone.
- Configure the servers.
Unlike BIND Version 8, signatures are
not verified when the BIND Version 9 software is loaded. Therefore,
zone keys for authoritative zones do not need to be specified in the
configuration file. The public key for any security root must be
present in the configuration file's
trusted-keys
, as described in Section 6.5.
6.2.6.1 DNSSEC Restrictions
BIND Version 9 has the following restrictions when using DNSSEC:
- Certain BIND server implementations do not support AAAA (IPv6
address) records. When queried for a AAAA (IPv6) record type by the
BIND resolver, these name servers will return an NXDOMAIN status, even
if an A (IPv4) record exists for the same domain name. These name
servers should be returning NOERROR as the status for such a query.
This problems can result in delays during host name resolution.
BIND Version 9.3.1, which is supported with this version of TCP/IP
Services does not exhibit this problem.
- Serving secure zones
When acting as an authoritative name
server, BIND Version 9 includes KEY, SIG, and NXT records in responses
as specified in RFC 2535 when the request has the DO flag set in the
query.
Response generation for wildcard records in secure zones is
not fully supported. Responses indicating the nonexistence of a name
include a NXT record proving the nonexistence of the name itself, but
do not include any NXT records to prove the nonexistence of a matching
wildcard record. Positive responses resulting from wildcard expansion
do not include the NXT records to prove the nonexistence of a
non-wildcard match or a more specific wildcard match.
- Secure resolution
Basic support for validation of DNSSEC
signatures in responses has been implemented but should be considered
experimental.
When acting as a caching name server, BIND Version 9
is capable of performing basic DNSSEC validation of positive as well as
nonexistence responses. This functionality is enabled by including a
trusted-keys clause containing the top-level zone key of the DNSSEC
tree in the configuration file.
Validation of wildcard responses is
not currently supported. In particular, a "name does not exist"
response will validate successfully even if the server does not contain
the NXT records to prove the nonexistence of a matching wildcard.
Proof of insecure status for insecure zones delegated from secure
zones works when the zones are completely insecure. Privately secured
zones delegated from secure zones will not work in all cases, such as
when the privately secured zone is served by the same server as an
ancestor (but not parent) zone.
Handling of the CD bit in queries
is now fully implemented. Validation is not attempted for recursive
queries if CD is set.
- Secure dynamic update
Dynamic updating of secure zones has been
partially implemented. Affected NXT and SIG records are updated by the
server when an update occurs. Use the update-policy statement in the
zone definition for advanced access control.
- Secure zone transfers
BIND Version 9 does not implement the
zone transfer security mechanisms of RFC 2535 because they are
considered inferior to the use of TSIG or SIG(0) to ensure the
integrity of zone transfers.
6.3 Migrating from BIND Version 4 to BIND Version 9
If you set up your BIND environment using an old version of the TCP/IP
Services product, you must convert the UCX databases and configuration
information to the BIND Version 9 format.
To convert your BIND configuration, enter the following command:
TCPIP> CONVERT/CONFIGURATION BIND
|
This command extracts the BIND-specific configuration information from
UCX$CONFIGURATION.DAT and creates the BIND Version 9 configuration file
TCPIP$BIND.CONF. It renames your BIND databases, where necessary.
You can continue to use the SET CONFIGURATION BIND commands to make
changes to your configuration (see Section 6.8), or you can make
changes by editing the text file TCPIP$BIND.CONF (see Section 6.5).
If you continue to use the SET CONFIGURATION BIND commands, you must
also enter the CONVERT/CONFIGURATION BIND command in order for your
changes to take effect.