install.sh: validate $Girocco::Config::reporoot a bit more
[girocco.git] / jailsetup.sh
bloba4b526408fccad105bc71e1d6d48dd7a137821cd
1 #!/bin/sh
2 # The Girocco jail setup script
4 # If the first parameter is "dbonly", setup the database only
6 # We are designed to set up the chroot based on the output of
7 # `uname -s` by sourcing a suitable system-specific script.
8 # Unrecognized systems will generate an error. When using
9 # "dbonly" the setup of the chroot binaries is skipped so the
10 # output of `uname -s` does not matter in that case.
12 set -e
14 curdir="$(pwd)"
15 srcdir="$curdir/src"
16 getent="$srcdir/getent"
17 . ./shlib.sh
19 # find_std_utility should always come up with the full path to the standard
20 # version of the utility whose name is passed as "$1"
21 getconf="/usr/bin/getconf"
22 [ -x "$getconf" ] || getconf="/bin/getconf"
23 [ -x "$getconf" ] || getconf="getconf"
24 stdpath="$("unset" -f command; "command" "$getconf" "PATH" 2>/dev/null)" || :
25 ":" "${stdpath:=/bin:/usr/bin}"
26 stdpath="$stdpath:/sbin:/usr/sbin"
27 find_std_utility() (
28 "unset" -f unalias command "$1" >/dev/null 2>&1 || :
29 "unalias" -a >/dev/null 2>&1 || :
30 PATH="$stdpath" && "export" PATH || :
31 "command" -v "$1"
32 ) 2>/dev/null
34 dbonly=
35 [ "$1" != "dbonly" ] || dbonly=1
37 reserved_users="root sshd _sshd mob git lock bundle nobody everyone $cfg_cgi_user $cfg_mirror_user"
39 # Require either sshd or _sshd user unless "dbonly"
40 sshd_user=sshd
41 if ! "$getent" passwd sshd >/dev/null && ! "$getent" passwd _sshd >/dev/null; then
42 if [ -n "$dbonly" ]; then
43 if ! [ -s etc/passwd ]; then
44 # Only complain on initial etc/passwd creation
45 echo "WARNING: no sshd or _sshd user, omitting entries from chroot etc/passwd"
47 sshd_user=
48 else
49 echo "*** Error: You do not have required sshd or _sshd user in system." >&2
50 exit 1
52 else
53 "$getent" passwd sshd >/dev/null || sshd_user=_sshd
56 # Verify we have all we need
57 if ! "$getent" passwd "$cfg_mirror_user" >/dev/null; then
58 echo "*** Error: You do not have \"$cfg_mirror_user\" user in system yet." >&2
59 exit 1
61 if ! "$getent" passwd "$cfg_cgi_user" >/dev/null; then
62 echo "*** Error: You do not have \"$cfg_cgi_user\" user in system yet." >&2
63 exit 1
65 if [ -n "$dbonly" ] && [ -z "$cfg_owning_group" ]; then
66 cfg_owning_group="$("$getent" passwd "$cfg_mirror_user" | cut -d : -f 4)"
67 elif ! "$getent" group "$cfg_owning_group" >/dev/null; then
68 echo "*** Error: You do not have \"$cfg_owning_group\" group in system yet." >&2
69 exit 1
72 # One last paranoid check before we go writing all over everything
73 if [ -z "$cfg_chroot" ] || [ "$cfg_chroot" = "/" ]; then
74 echo "*** Error: chroot location is not set or is invalid." >&2
75 echo "*** Error: perhaps you have an incorrect Config.pm?" >&2
76 exit 1
79 umask 022
80 mkdir -p "$cfg_chroot"
81 cd "$cfg_chroot"
82 chmod 755 "$cfg_chroot" ||
83 echo "WARNING: Cannot chmod $cfg_chroot"
85 mkdir -p var/empty
86 chmod 0555 var/empty ||
87 echo "WARNING: Cannot chmod a=rx $cfg_chroot/var/empty"
89 # Set up basic user/group configuration; if there isn't any already
90 mobpass=
91 [ -n "$cfg_mob" ] || mobpass='x'
92 mkdir -p etc
93 if ! [ -s etc/passwd ]; then
94 cat >etc/passwd <<EOT
95 root:x:0:0:system administrator:/var/empty:/bin/false
96 nobody:x:$("$getent" passwd nobody | cut -d : -f 3-4):unprivileged user:/var/empty:/bin/false
97 EOT
98 [ -z "$sshd_user" ] || cat >>etc/passwd <<EOT
99 sshd:x:$("$getent" passwd $sshd_user | cut -d : -f 3-4):privilege separation:/var/empty:/bin/false
100 _sshd:x:$("$getent" passwd $sshd_user | cut -d : -f 3-4):privilege separation:/var/empty:/bin/false
102 [ "$cfg_cgi_user" = "$cfg_mirror_user" ] || cat >>etc/passwd <<EOT
103 $cfg_cgi_user:x:$("$getent" passwd "$cfg_cgi_user" | cut -d : -f 3-5):/:/bin/true
105 cat >>etc/passwd <<EOT
106 $cfg_mirror_user:x:$("$getent" passwd "$cfg_mirror_user" | cut -d : -f 3-5):/:/bin/true
107 everyone:x:65537:$("$getent" group "$cfg_owning_group" | cut -d : -f 3):every user:/:/bin/false
108 mob:$mobpass:65538:$("$getent" group "$cfg_owning_group" | cut -d : -f 3):the mob:/:/bin/git-shell-verify
109 git::65539:$("$getent" passwd nobody | cut -d : -f 4):read-only access:/:/bin/git-shell-verify
111 elif [ -z "$dbonly" ]; then
112 # Make sure an sshd entry is present
113 if ! grep -q '^sshd:' etc/passwd; then
114 echo "*** Error: chroot etc/passwd exists but lacks sshd entry." >&2
115 exit 1
119 if ! [ -s etc/group ]; then
120 cat >etc/group <<EOT
121 _repo:x:$("$getent" group "$cfg_owning_group" | cut -d : -f 3):$cfg_mirror_user
125 # Set up basic default Git configuration
126 # Initialize one if none exists or update critical variables for an existing one
127 mkdir -p etc/girocco
128 didchmod=
129 if [ -e etc/girocco/.gitconfig ] && ! [ -f etc/girocco/.gitconfig ]; then
130 echo "*** Error: chroot etc/girocco/.gitconfig exists but is not a file." >&2
131 exit 1
133 if [ -f etc/girocco/.gitconfig ]; then
134 gcerr=0
135 x="$(git config --file etc/girocco/.gitconfig --get "no--such--section.no such subsection.no--such--key")" || gcerr=$?
136 if [ $gcerr -gt 1 ]; then
137 echo "*** Error: chroot etc/girocco/.gitconfig exists but is corrupt." >&2
138 echo "*** Error: either remove it or edit it to correct the problem." >&2
139 exit 1
142 if ! [ -s etc/girocco/.gitconfig ]; then
143 chmod u+w etc/girocco
144 didchmod=1
145 cat >etc/girocco/.gitconfig <<EOT
146 # Any values set here will take effect whenever Girocco runs a git command
150 # $1 => name, $2 => value, $3 => overwrite_flag
151 # if $3 is "2" and $2 is "" value will be unset
152 update_config_item() {
153 _existsnot=
154 _oldval=
155 _oldval="$(git config --file etc/girocco/.gitconfig --get "$1")" || _existsnot=1
156 if [ -n "$_existsnot" ]; then
157 [ -n "$2" ] || [ "$3" != "2" ] || return 0
158 else
159 [ -n "$3" ] || return 0
160 [ "$_oldval" != "$2" ] || { [ "$3" = "2" ] && [ -z "$2" ]; } || return 0
162 [ -n "$didchmod" ] || { chmod u+w etc/girocco; didchmod=1; }
163 if [ "$3" = "2" ] && [ -z "$2" ]; then
164 git config --file etc/girocco/.gitconfig --unset "$1"
165 else
166 git config --file etc/girocco/.gitconfig "$1" "$2"
168 if [ -n "$_existsnot" ]; then
169 echo "chroot: etc/girocco/.gitconfig: config $1: (created) \"$2\""
170 elif [ "$3" = "2" ] && [ -z "$2" ]; then
171 echo "chroot: etc/girocco/.gitconfig: config $1: (removed)"
172 else
173 echo "chroot: etc/girocco/.gitconfig: config $1: \"$_oldval\" -> \"$2\""
176 if [ -n "$cfg_git_no_mmap" ]; then
177 update_config_item core.packedGitWindowSize 1m 1
178 else
179 update_config_item core.packedGitWindowSize 32m 1
181 if [ -n "$var_window_memory" ]; then
182 update_config_item pack.windowMemory "$var_window_memory" 1
184 if [ -n "$cfg_jgit_compatible_bitmaps" ]; then
185 update_config_item pack.writeBitmapHashCache false 1
186 else
187 update_config_item pack.writeBitmapHashCache true 1
189 update_config_item core.pager "cat" 1
190 update_config_item core.compression 5
191 update_config_item diff.renameLimit 250
192 update_config_item transfer.unpackLimit 1 1
193 update_config_item http.lowSpeedLimit 1
194 update_config_item http.lowSpeedTime 600
195 update_config_item receive.advertisePushOptions false 1
196 update_config_item receive.maxInputSize "${cfg_max_receive_size:-0}" 1
197 update_config_item girocco.notifyHook "${cfg_default_notifyhook}" 2
199 # set up some default ssh client config just in case (e.g. git-svn)
200 if [ -e etc/girocco/.ssh ] && ! [ -d etc/girocco/.ssh ]; then
201 echo "*** Error: chroot etc/girocco/.ssh exists but is not a directory." >&2
202 exit 1
204 if [ -e etc/girocco/.ssh/config ] && ! [ -f etc/girocco/.ssh/config ]; then
205 echo "*** Error: chroot etc/girocco/.ssh/config exists but is not a file." >&2
206 exit 1
208 if ! [ -s etc/girocco/.ssh/config ]; then
209 chmod u+w etc/girocco
210 didchmod=1
211 [ -d etc/girocco/.ssh ] || mkdir etc/girocco/.ssh
212 cat >etc/girocco/.ssh/config <<EOT
213 # Any values set here will take effect whenever Girocco svn runs an ssh client command
214 BatchMode yes
215 StrictHostKeyChecking no
216 CheckHostIP no
217 UserKnownHostsFile /dev/null
221 [ -z "$didchmod" ] || chmod a-w etc/girocco
223 mkdir -p etc/sshkeys etc/sshcerts etc/sshactive
224 for ruser in $reserved_users; do
225 touch etc/sshkeys/$ruser
226 done
227 chgrp $cfg_owning_group etc etc/sshkeys etc/sshcerts etc/sshactive ||
228 echo "WARNING: Cannot chgrp $cfg_owning_group the etc directories"
229 chgrp $cfg_owning_group etc/passwd ||
230 echo "WARNING: Cannot chgrp $cfg_owning_group $cfg_chroot/etc/passwd"
231 chgrp $cfg_owning_group etc/group ||
232 echo "WARNING: Cannot chgrp $cfg_owning_group $cfg_chroot/etc/group"
233 chgrp $cfg_owning_group etc/girocco etc/girocco/.gitconfig ||
234 echo "WARNING: Cannot chgrp $cfg_owning_group $cfg_chroot/etc/girocco"
235 chgrp $cfg_owning_group etc/girocco/.ssh etc/girocco/.ssh/config ||
236 echo "WARNING: Cannot chgrp $cfg_owning_group $cfg_chroot/etc/.ssh"
237 chmod g+s etc etc/sshkeys etc/sshcerts etc/sshactive ||
238 echo "WARNING: Cannot chmod g+s the etc directories"
239 chmod g+w etc etc/sshkeys etc/sshcerts etc/sshactive ||
240 echo "WARNING: Cannot chmod g+w the etc directories"
241 chmod g+w etc/passwd etc/group ||
242 echo "WARNING: Cannot chmod g+w the etc/passwd and/or etc/group files"
243 chmod go-w etc/passwd etc/girocco etc/girocco/.gitconfig ||
244 echo "WARNING: Cannot chmod go-w etc/girocco and/or etc/girocco/.gitconfig"
245 chmod go-w etc/girocco/.ssh etc/girocco/.ssh/config ||
246 echo "WARNING: Cannot chmod go-w etc/girocco/.ssh and/or etc/girocco/.ssh/config"
247 chmod go-rwx etc/girocco/.ssh/config ||
248 echo "WARNING: Cannot chmod go-rwx etc/girocco/.ssh/config"
249 chmod a-w etc/girocco/.ssh ||
250 echo "WARNING: Cannot chmod a-w etc/girocco/.ssh"
251 chmod a-w etc/girocco ||
252 echo "WARNING: Cannot chmod a-w etc/girocco"
253 chmod -R g+w etc/sshkeys etc/sshcerts etc/sshactive 2>/dev/null ||
254 echo "WARNING: Cannot chmod g+w the sshkeys, sshcerts and/or sshactive files"
256 # Note time of last install
257 >etc/sshactive/_install
259 [ -z "$dbonly" ] || exit 0
261 # Make sure the system type is supported for chroot
262 sysname="$(uname -s | tr A-Z a-z)" || :
263 : ${sysname:=linux}
264 nosshdir=
265 # These equivalents may need to be expanded at some point
266 case "$sysname" in
267 *kfreebsd*)
268 sysname=linux;;
269 *darwin*)
270 sysname=darwin;;
271 *dragonfly*)
272 sysname=dragonfly;;
273 *freebsd*)
274 sysname=freebsd;;
275 *linux*)
276 sysname=linux;;
277 esac
279 chrootsetup="$curdir/chrootsetup_$sysname.sh"
280 if ! [ -f "$chrootsetup" ] || ! [ -r "$chrootsetup" ] || ! [ -s "$chrootsetup" ]; then
281 echo "*** Error: $chrootsetup not found" >&2
282 echo "*** Error: creating a chroot for a $(uname -s) system is not supported" >&2
283 exit 1
286 # validate reporoot, chroot, jailreporoot and sshd_bin before doing anything more
288 # validates the passed in dir if a second argument is not empty dir must NOT
289 # start with / otherwise it must. A trailing '/' is removed and any duplicated
290 # // are removed and a sole / or empty is disallowed.
291 make_valid_dir() {
292 _check="$(echo "$1" | tr -s /)"
293 _check="${_check%/}"
294 [ -n "$_check" ] && [ "$_check" != "/" ] || return 1
295 if [ -z "$2" ]; then
296 # must start with '/'
297 case "$_check" in /*) :;; *) return 1; esac
298 else
299 # must NOT start with '/'
300 case "$_check" in /*) return 1; esac
302 echo "$_check"
305 if ! reporoot="$(make_valid_dir "$cfg_reporoot")"; then
306 echo "*** Error: invalid Config::reporoot: $cfg_reporoot" >&2
307 echo "*** Error: MUST start with '/' and MUST NOT be '/'" >&2
308 exit 1
310 if ! chroot="$(make_valid_dir "$cfg_chroot")"; then
311 echo "*** Error: invalid Config::chroot: $cfg_chroot" >&2
312 echo "*** Error: MUST start with '/' and MUST NOT be '/'" >&2
313 exit 1
315 if ! jailreporoot="$(make_valid_dir "$cfg_jailreporoot" 1)"; then
316 echo "*** Error: invalid Config::jailreporoot: $cfg_jailreporoot" >&2
317 echo "*** Error: MUST NOT start with '/' and MUST NOT be ''" >&2
318 exit 1
321 # chroot MUST NOT be reporoot
322 if [ "$chroot" = "$reporoot" ]; then
323 echo "*** Error: invalid Config::reporoot: $cfg_reporoot" >&2
324 echo "*** Error: invalid Config::chroot: $cfg_chroot" >&2
325 echo "*** Error: reporoot and chroot MUST NOT be the same" >&2
326 exit 1
329 # chroot MUST NOT be a subdirectory of reporoot
330 case "$chroot" in "$reporoot"/*)
331 echo "*** Error: invalid Config::reporoot: $cfg_reporoot" >&2
332 echo "*** Error: invalid Config::chroot: $cfg_chroot" >&2
333 echo "*** Error: chroot MUST NOT be a subdirectory of reporoot" >&2
334 exit 1
335 esac
337 # chroot/jailreporoot MUST NOT be a subdirectory of reporoot
338 case "$chroot/$jailreporoot" in "$reporoot"/*)
339 echo "*** Error: invalid Config::reporoot: $cfg_reporoot" >&2
340 echo "*** Error: invalid Config::chroot: $cfg_chroot" >&2
341 echo "*** Error: invalid Config::jailreporoot: $cfg_jailreporoot" >&2
342 echo "*** Error: chroot/jailreporoot MUST NOT be a subdirectory of reporoot" >&2
343 exit 1
344 esac
346 # reporoot MUST NOT be a subdirectory of chroot/jailreporoot
347 case "$reporoot" in "$chroot/$jailreporoot"/*)
348 echo "*** Error: invalid Config::reporoot: $cfg_reporoot" >&2
349 echo "*** Error: invalid Config::chroot: $cfg_chroot" >&2
350 echo "*** Error: invalid Config::jailreporoot: $cfg_jailreporoot" >&2
351 echo "*** Error: reporoot MUST NOT be a subdirectory of chroot/jailreporoot" >&2
352 exit 1
353 esac
355 # sshd_bin MUST be undef (or empty) or a full absolute path
356 sshd_bin_bad=
357 case "$cfg_sshd_bin" in *"/../"*) sshd_bin_bad=1;; ""|/?*) :;; *) sshd_bin_bad=1;; esac
358 [ -z "$sshd_bin_bad" ] || {
359 echo "*** Error: invalid Config::sshd_bin $cfg_sshd_bin" >&2
360 echo "*** Error: if set, sshd_bin must be an absolute path" >&2
361 exit 1
363 sshd_bin="$cfg_sshd_bin"
364 [ -n "$sshd_bin" ] || sshd_bin="$(find_std_utility "sshd")" || {
365 echo "*** Error: Config::sshd_bin is not set and no sshd could be found" >&2
366 echo "*** Error: please set Config::sshd_bin to an absolute path to sshd" >&2
367 exit 1
369 [ -x "$sshd_bin" ] && [ -r "$sshd_bin" ] && [ -f "$sshd_bin" ] || {
370 echo "*** Error: the selected sshd ('$sshd_bin') was not found, not readable or not executable" >&2
371 exit 1
374 # Set the user and group on the top of the chroot before creating anything else
375 chown 0:0 "$chroot"
377 # When we create a fork, the alternates always have an absolute path.
378 # If reporoot is not --bind mounted at the same location in chroot we must
379 # create a suitable symlink so the absolute path alternates continue to work
380 # in the ssh chroot or else forks will be broken in there.
381 if [ "$reporoot" != "/$jailreporoot" ]; then
382 mkdirp="$(dirname "${reporoot#/}")"
383 [ "$mkdirp" = "." ] && mkdirp=
384 lnback=
385 [ -z "$mkdirp" ] || lnback="$(echo "$mkdirp/" | sed -e 's,[^/]*/,../,g')"
386 [ -z "$mkdirp" ] || mkdir -p "$chroot/$mkdirp"
387 (umask 0; ln -s -f -n "$lnback$jailreporoot" "$chroot$reporoot")
388 [ $? -eq 0 ] || exit 1
391 # First, setup basic platform-independent directory structure
392 mkdir -p bin dev etc lib sbin var/empty var/run "$jailreporoot"
393 chmod 0555 var/empty
394 rm -rf usr local
395 ln -s . usr
396 ln -s . local
398 # Now source the platform-specific script that is responsible for dev device
399 # setup, proc setup (if needed), lib64 setup (if needed) and basic library
400 # installation to make a chroot operational. Additionally it will define a
401 # pull_in_bin function that can be used to add executables and their library
402 # dependencies to the chroot and finally will install a suitable nc.openbsd
403 # compatible version of netcat that supports connections to unix sockets.
404 . "$chrootsetup"
406 # Now, bring in sshd, sh etc.
407 # The $chrootsetup script should have already provided a suitable nc.openbsd
408 install -p "$cfg_basedir/bin/git-shell-verify" bin/git-shell-verify.new
409 install -p "$cfg_basedir/bin/git-askpass-password" bin/git-askpass-password.new
410 perl -i -p \
411 -e 's|^#!.*|#!/bin/sh| if $. == 1;' \
412 -e 'close ARGV if eof;' \
413 bin/git-shell-verify.new bin/git-askpass-password.new
414 mv -f bin/git-askpass-password.new bin/git-askpass-password
415 mv -f bin/git-shell-verify.new bin/git-shell-verify
416 pull_in_bin "$cfg_basedir/bin/can_user_push" bin
417 pull_in_bin "$cfg_basedir/bin/list_packs" bin
418 pull_in_bin "$cfg_basedir/bin/strftime" bin
419 pull_in_bin "$var_sh_bin" bin/sh
420 # be paranoid since these are going into the chroot and make sure
421 # that we get the "standard" versions of them (they are all standard "POSIX"
422 # utilities) not some wayward version picked up by a haphazard PATH
423 pull_in_bin "$(find_std_utility cat )" bin
424 pull_in_bin "$(find_std_utility chmod )" bin
425 pull_in_bin "$(find_std_utility date )" bin
426 pull_in_bin "$(find_std_utility find )" bin
427 pull_in_bin "$(find_std_utility mkdir )" bin
428 pull_in_bin "$(find_std_utility mv )" bin
429 pull_in_bin "$(find_std_utility rm )" bin
430 pull_in_bin "$(find_std_utility sleep )" bin
431 pull_in_bin "$(find_std_utility sort )" bin
432 pull_in_bin "$(find_std_utility touch )" bin
433 pull_in_bin "$(find_std_utility tr )" bin
434 pull_in_bin "$(find_std_utility wc )" bin
435 # this one's already been validated and might be in a non-standard location
436 pull_in_bin "$sshd_bin" sbin
438 # ...and the bits of git we need,
439 # being sure to use the configured git and its --exec-path to find the pieces
440 for i in git git-index-pack git-receive-pack git-shell git-update-server-info \
441 git-upload-archive git-upload-pack git-unpack-objects git-config \
442 git-for-each-ref git-rev-list git-rev-parse git-symbolic-ref; do
443 pull_in_bin "$var_git_exec_path/$i" bin git
444 done
446 # ...and any extras identified by install.sh
447 # these are also all standard "POSIX" utilities
448 # ones that a decent sh implementation would have built-in already...
449 if [ -n "$GIROCCO_CHROOT_EXTRA_INSTALLS" ]; then
450 for i in $GIROCCO_CHROOT_EXTRA_INSTALLS; do
451 pull_in_bin "$(find_std_utility "$(basename "$i")")" bin
452 done
455 # Note time of last jailsetup
456 >etc/sshactive/_jailsetup
458 # Update permissions on the database files
459 chown $cfg_cgi_user:$cfg_owning_group etc/passwd etc/group
460 chown -R $cfg_cgi_user:$cfg_owning_group etc/sshkeys etc/sshcerts etc/sshactive
461 chown $cfg_mirror_user:$cfg_owning_group etc etc/girocco etc/girocco/.gitconfig
462 chown $cfg_mirror_user:$cfg_owning_group etc/girocco/.ssh etc/girocco/.ssh/config
464 # Set up basic sshd configuration:
465 if [ -n "$nosshdir" ]; then
466 rm -rf etc/ssh
467 ln -s . etc/ssh
468 ! [ -f /etc/moduli ] || { cp -p /etc/moduli etc/; chown 0:0 etc/moduli; }
469 else
470 ! [ -e etc/ssh ] || [ -d etc/ssh ] || rm -rf etc/ssh
471 mkdir -p etc/ssh
472 ! [ -f /etc/ssh/moduli ] || { cp -p /etc/ssh/moduli etc/ssh/; chown 0:0 etc/ssh/moduli; }
474 mkdir -p var/run/sshd
475 if ! [ -s etc/ssh/sshd_config ]; then
476 cat >etc/ssh/sshd_config <<EOT
477 Protocol 2
478 Port $cfg_sshd_jail_port
479 UsePAM no
480 X11Forwarding no
481 AllowAgentForwarding no
482 AllowTcpForwarding no
483 PermitTunnel no
484 IgnoreUserKnownHosts yes
485 PrintLastLog no
486 PrintMotd no
487 UseDNS no
488 PermitRootLogin no
489 UsePrivilegeSeparation yes
491 HostKey /etc/ssh/ssh_host_rsa_key
493 if [ -z "$cfg_disable_dsa" ]; then
494 cat >>etc/ssh/sshd_config <<EOT
495 HostKey /etc/ssh/ssh_host_dsa_key
498 cat >>etc/ssh/sshd_config <<EOT
499 AuthorizedKeysFile /etc/sshkeys/%u
500 StrictModes no
502 # mob and git users:
503 PermitEmptyPasswords yes
504 ChallengeResponseAuthentication no
505 PasswordAuthentication yes
508 if ! [ -s etc/ssh/ssh_host_rsa_key ]; then
509 bits=2048
510 if [ "$cfg_rsakeylength" -gt "$bits" ] 2>/dev/null; then
511 bits="$cfg_rsakeylength"
513 yes | ssh-keygen -b "$bits" -t rsa -N "" -C Girocco -f etc/ssh/ssh_host_rsa_key
515 if [ -z "$cfg_disable_dsa" ] && ! [ -s etc/ssh/ssh_host_dsa_key ]; then
516 # ssh-keygen can only create 1024 bit DSA keys
517 yes | ssh-keygen -b 1024 -t dsa -N "" -C Girocco -f etc/ssh/ssh_host_dsa_key
520 # Set the final permissions on the binaries and perform any final twiddling
521 chroot_update_permissions
523 # Change the owner of the sshd-related files
524 chown 0:0 etc/ssh/ssh_* etc/ssh/sshd_*
526 echo "--- Add to your boot scripts: mount --bind $reporoot $chroot/$jailreporoot"
527 echo "--- Add to your boot scripts: mount --bind /proc $chroot/proc"
528 echo "--- Add to your syslog configuration: listening on socket $chroot/dev/log"
529 echo "--- To restart a running jail's sshd: sudo kill -HUP \$(cat $chroot/var/run/sshd.pid)"