I set up a bacula client through an SSH tunnel, and have a few improvements over the documented method. So I wrote a new one - if there is interest, feel free to snag it for your documentation!
-------------------------- Using an SSH tunnel with Bacula Credit goes to Stephan Holl and Joshua Eugler, who wrote earlier documents and scripts that document the basic idea of an SSH tunnel. This is a similar approach, but different in some subtle but important details. Most importantly, this approach allows you to use the same Storage daemon for both local clients and clients through an SSH tunnel. This is important because you can use the same pool and schedule for both. I also changed the way SSH is invoked to make it self-closing. The tunnel will simply disappear as soon as the backup is completed. 1. What you need On the bacula-director side: - bacula director running as user "bacula", and fully configured and working using the standard ports 9101-9103. You can only have one Storage Daemon in your configuration. Make sure the Storage resource uses an FQDN; do not use IP addresses. - openssh - an available port to listen on, in addition to bacula's standard 9101-9103. I chose 9112. - the firewall must be open on localhost, ports 9101 and 9103. On the bacula client side: - bacula-fd installed. - a user account with minimal permissions. Let's call it "tunneluser". This account will only serve as end point for the SSH tunnel. For security reasons, DO NOT use the root account. - The firewall must be open on localhost, port 9101, 9102 and 9103. It is not necessary to open these ports on the network. 2. Setting up OpenSSH on the server side First, we need to set up ssh for the bacula user, since this is the user name the director uses: Log on as user "bacula" (you may have to log on as root, and then use the "su - bacula" command to actually become user bacula). You should be in bacula's home directory - probably /var/lib/bacula. mkdir -p ~/.ssh chmod 700 ~/.ssh Also verify that .ssh is owned by user bacula, group bacula. Now we need to create an SSH key pair into this new directory. Make sure that you do not use a pass phrase. We use the file names bacula_tunnel and bacula_tunnel.pub for the private and public keys, respectively. cd ~/.ssh ssh-keygen -b 2048 -C "SSH Tunnel for bacula" -t rsa -f bacula_tunnel -N "" Create a file "config" in the ~/.ssh directory with the following content (yourclientFQDN is the actual FQDN that SSH will use to connect to the client. yourclientname should simply be the same as yourclientFQDN, although in some cases you could choose a different value for it). Host <yourclientFQDN> AddressFamily inet ConnectionAttempts 10 ForwardAgent no ForwardX11 no ForwardX11Trusted no GatewayPorts yes HostBasedAuthentication no HostKeyAlias <yourclientname> HostName <yourclientFQDN> IdentityFile ~/.ssh/bacula_tunnel.pub PasswordAuthentication no Protocol 2 ServerAliveCountMax 3 ServerAliveInterval 15 TCPKeepAlive no User tunneluser Just in case permissions got messed up on the way, fix them in the .ssh directory chmod 400 ~/.ssh/* Transfer the public key (the file bacula_tunnel.pub) to your client machine, using whatever method you like (USB, FTP, scp, file shares, ...). IMPORTANT: DO NOT TRANSFER THE PRIVATE KEY! 3. Setting up OpenSSH on the client side. install the SSH public key into the tunneluser account on the client machine: cd /home/tunneluser mkdir -p /home/tunneluser/.ssh touch /home/tunneluser/.ssh/authorized_keys # Make sure you use the double >> redirection, or you will destroy any # previous authorized keys if they existed. cat <wherever>/bacula_tunnel.pub >>/home/tunneluser/.ssh/authorized_keys chmod 700 /home/tunneluser/.ssh chmod f00 /home/tunneluser/.ssh/* chown -R tunneluser:tunneluser /home/tunneluser/.ssh 4. Complete OpenSSH setup Before you can use OpenSSH, you need to complete one more step: store the host's fingerprint. On the server side, log on as user "bacula" (or use "su - bacula"). Then use ssh to connect to your client. Note that you MUST use the same FQDN you used in the "config" file earlier. ssh <yourclientFQDN> ssh will now prompt you to accept the fingerprint. Once you are at the command prompt, you can type "exit" to leave ssh. 5. Bacula setup, client side. On the server, find the Address= lines for the Storage resource. Make sure the address is a FQDN on the private network, and do not resolve from the client. On the client, edit your /etc/hosts file by adding the following line: 127.0.0.1 <storageFQDN> Note: what this does is allow the file daemon (FD) to find the storage daemon (SD). Normally, the SD is of course hidden behind a firewall and inaccessible - that is why you are setting up an SSH tunnel, after all. This entry tricks your client system into believing that the SD is located at 127.0.0.1 - which actually will be the end of the tunnel that we are going to establish soon. The file daemon should listen only on port 127.0.0.1 FileDaemon { # this is me Name = <yourclientFQDN>-fd FDAddress = 127.0.0.1 FDport = 9102 # where we listen for the director WorkingDirectory = (use the standard values) Pid Directory = (use the standard values) Maximum Concurrent Jobs = (use the standard values) } 6. Bacula setup, server side Simply set up a client and job resource for the new client as usual, using the standard schedule and pool settings. Use <yourclientFQDN-fd> as the client name. Now change the client resource as follows: Name=<yourclientFQDN-fd Address=localhost FDPort=9112 In the job resource, add a Run Before Job script: Run Before Job = "/usr/local/sbin/sshbacula <yourclientFQDN>" 7. The SSH tunnel script Use the following script and save it as /usr/local/sbin/sshbacula. Remember to change the permission as needed: chmod +x /usr/local/sbin/sshbacula Hint: you may want to change the line CLIENT=$1 to CLIENT=${1:-<yourclientFQDN>} This will provide a default value to connect to if you don't specify it on the command line Please be aware that some lines in the script may have wrapped due to emailing ---- Start script below. #!/bin/bash must be the first line! #!/bin/bash # Establishes a self-killing SSH tunnel to the # given SSH server, and forwards the correct # ports for bacula usage. # Bacula-dir runs as user bacula, but with root's # environment. We need to trick it into running # actually looking for the .ssh directory in # the right place. USER=bacula HOME=$(grep "^$USER:" /etc/passwd | cut -d : -f 6) CLIENT=$1 LOCAL=$(hostname -f) SSH=/usr/bin/ssh echo "Starting SSH-tunnel to $CLIENT..." # -f means: go into background # -C means: use compression # -2 means: only use SSH2 # -R 9101:$LOCAL:9101 means: when client connects to remote port 9101 (bacula-dir), it will be # forwarded to this machine. # -R 9103:$LOCAL:9103 means: when client connects to remote port 9101 (bacula-sd), it will be # forwarded to this machine. # -L 9112:localhost:9102 means: when bacula-dir connects to port 9112 (instead of the normal 9102), # it will be forwarded to the client's FD. The client will think the connection was to port # 9102 as usual # sleep 60 is a simple command that will execute on the server and does nothing for 60 seconds, # then it exits. This keeps ssh running for 60 seconds. Once we connect to the FD, that # connection will keep ssh running even beyond the 60 seconds. # Using this approach, we do not need to tear down the tunnel later, it disconnects itself # automagically. # It is important to redirect stdout and stderr, or else bacula will not realize that the # script has terminated. $SSH -fC2 -R 9101:$LOCAL:9101 -R 9103:$LOCAL:9103 -L 9112:localhost:9102 $CLIENT sleep 60 > /dev/null 2>/dev/null # give ssh a little time to establish the connection. sleep 10 -- Kevin Keane Owner The NetTech Find the Uncommon: Expert Solutions for a Network You Never Have to Think About Office: 866-642-7116 http://www.4nettech.com This e-mail and attachments, if any, may contain confidential and/or proprietary information. Please be advised that the unauthorized use or disclosure of the information is strictly prohibited. The information herein is intended only for use by the intended recipient(s) named above. If you have received this transmission in error, please notify the sender immediately and permanently delete the e-mail and any copies, printouts or attachments thereof. ------------------------------------------------------------------------------ Create and Deploy Rich Internet Apps outside the browser with Adobe(R)AIR(TM) software. With Adobe AIR, Ajax developers can use existing skills and code to build responsive, highly engaging applications that combine the power of local resources and data with the reach of the web. Download the Adobe AIR SDK and Ajax docs to start building applications today-http://p.sf.net/sfu/adobe-com _______________________________________________ Bacula-users mailing list Bacula-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/bacula-users