]> andersk Git - openssh.git/blob - contrib/cygwin/ssh-host-config
4df5aa96963931383706c52c55b674b632f46daa
[openssh.git] / contrib / cygwin / ssh-host-config
1 #!/bin/sh
2 #
3 # ssh-host-config, Copyright 2000, Red Hat Inc.
4 #
5 # This file is part of the Cygwin port of OpenSSH.
6
7 # Subdirectory where the new package is being installed
8 PREFIX=/usr
9
10 # Directory where the config files are stored
11 SYSCONFDIR=/etc
12
13 # Subdirectory where an old package might be installed
14 OLDPREFIX=/usr/local
15 OLDSYSCONFDIR=${OLDPREFIX}/etc
16
17 progname=$0
18 auto_answer=""
19 port_number=22
20
21 privsep_configured=no
22 privsep_used=yes
23 sshd_in_passwd=no
24 sshd_in_sam=no
25
26 request()
27 {
28   if [ "${auto_answer}" = "yes" ]
29   then
30     return 0
31   elif [ "${auto_answer}" = "no" ]
32   then
33     return 1
34   fi
35
36   answer=""
37   while [ "X${answer}" != "Xyes" -a "X${answer}" != "Xno" ]
38   do
39     echo -n "$1 (yes/no) "
40     read answer
41   done
42   if [ "X${answer}" = "Xyes" ]
43   then
44     return 0
45   else
46     return 1
47   fi
48 }
49
50 # Check options
51
52 while :
53 do
54   case $# in
55   0)
56     break
57     ;;
58   esac
59
60   option=$1
61   shift
62
63   case "$option" in
64   -d | --debug )
65     set -x
66     ;;
67
68   -y | --yes )
69     auto_answer=yes
70     ;;
71
72   -n | --no )
73     auto_answer=no
74     ;;
75
76   -p | --port )
77     port_number=$1
78     shift
79     ;;
80
81   *)
82     echo "usage: ${progname} [OPTION]..."
83     echo
84     echo "This script creates an OpenSSH host configuration."
85     echo
86     echo "Options:"
87     echo "    --debug  -d     Enable shell's debug output."
88     echo "    --yes    -y     Answer all questions with \"yes\" automatically."
89     echo "    --no     -n     Answer all questions with \"no\" automatically."
90     echo "    --port   -p <n> sshd listens on port n."
91     echo
92     exit 1
93     ;;
94
95   esac
96 done
97
98 # Check if running on NT
99 _sys="`uname -a`"
100 _nt=`expr "$_sys" : "CYGWIN_NT"`
101
102 # Check for running ssh/sshd processes first. Refuse to do anything while
103 # some ssh processes are still running
104
105 if ps -ef | grep -v grep | grep -q ssh
106 then
107   echo
108   echo "There are still ssh processes running. Please shut them down first."
109   echo
110   exit 1
111 fi
112
113 # Check for ${SYSCONFDIR} directory
114
115 if [ -e "${SYSCONFDIR}" -a ! -d "${SYSCONFDIR}" ]
116 then
117   echo
118   echo "${SYSCONFDIR} is existant but not a directory."
119   echo "Cannot create global configuration files."
120   echo
121   exit 1
122 fi
123
124 # Create it if necessary
125
126 if [ ! -e "${SYSCONFDIR}" ]
127 then
128   mkdir "${SYSCONFDIR}"
129   if [ ! -e "${SYSCONFDIR}" ]
130   then
131     echo
132     echo "Creating ${SYSCONFDIR} directory failed"
133     echo
134     exit 1
135   fi
136 fi
137
138 # Create /var/log and /var/log/lastlog if not already existing
139
140 if [ -f /var/log ]
141 then
142   echo "Creating /var/log failed\!"
143 else
144   if [ ! -d /var/log ]
145   then
146     mkdir -p /var/log
147   fi
148   if [ -d /var/log/lastlog ]
149   then
150     echo "Creating /var/log/lastlog failed\!"
151   elif [ ! -f /var/log/lastlog ]
152   then
153     cat /dev/null > /var/log/lastlog
154   fi
155 fi
156
157 # Create /var/empty file used as chroot jail for privilege separation
158 if [ -f /var/empty ]
159 then
160   echo "Creating /var/empty failed\!"
161 else
162   mkdir -p /var/empty
163   # On NT change ownership of that dir to user "system"
164   if [ $_nt -gt 0 ]
165   then
166     chmod 755 /var/empty
167     chown system.system /var/empty
168   fi
169 fi
170
171 # Check for an old installation in ${OLDPREFIX} unless ${OLDPREFIX} isn't
172 # the same as ${PREFIX}
173
174 old_install=0
175 if [ "${OLDPREFIX}" != "${PREFIX}" ]
176 then
177   if [ -f "${OLDPREFIX}/sbin/sshd" ]
178   then
179     echo
180     echo "You seem to have an older installation in ${OLDPREFIX}."
181     echo
182     # Check if old global configuration files exist
183     if [ -f "${OLDSYSCONFDIR}/ssh_host_key" ]
184     then
185       if request "Do you want to copy your config files to your new installation?"
186       then
187         cp -f ${OLDSYSCONFDIR}/ssh_host_key ${SYSCONFDIR}
188         cp -f ${OLDSYSCONFDIR}/ssh_host_key.pub ${SYSCONFDIR}
189         cp -f ${OLDSYSCONFDIR}/ssh_host_dsa_key ${SYSCONFDIR}
190         cp -f ${OLDSYSCONFDIR}/ssh_host_dsa_key.pub ${SYSCONFDIR}
191         cp -f ${OLDSYSCONFDIR}/ssh_config ${SYSCONFDIR}
192         cp -f ${OLDSYSCONFDIR}/sshd_config ${SYSCONFDIR}
193       fi
194     fi
195     if request "Do you want to erase your old installation?"
196     then
197       rm -f ${OLDPREFIX}/bin/ssh.exe
198       rm -f ${OLDPREFIX}/bin/ssh-config
199       rm -f ${OLDPREFIX}/bin/scp.exe
200       rm -f ${OLDPREFIX}/bin/ssh-add.exe
201       rm -f ${OLDPREFIX}/bin/ssh-agent.exe
202       rm -f ${OLDPREFIX}/bin/ssh-keygen.exe
203       rm -f ${OLDPREFIX}/bin/slogin
204       rm -f ${OLDSYSCONFDIR}/ssh_host_key
205       rm -f ${OLDSYSCONFDIR}/ssh_host_key.pub
206       rm -f ${OLDSYSCONFDIR}/ssh_host_dsa_key
207       rm -f ${OLDSYSCONFDIR}/ssh_host_dsa_key.pub
208       rm -f ${OLDSYSCONFDIR}/ssh_config
209       rm -f ${OLDSYSCONFDIR}/sshd_config
210       rm -f ${OLDPREFIX}/man/man1/ssh.1
211       rm -f ${OLDPREFIX}/man/man1/scp.1
212       rm -f ${OLDPREFIX}/man/man1/ssh-add.1
213       rm -f ${OLDPREFIX}/man/man1/ssh-agent.1
214       rm -f ${OLDPREFIX}/man/man1/ssh-keygen.1
215       rm -f ${OLDPREFIX}/man/man1/slogin.1
216       rm -f ${OLDPREFIX}/man/man8/sshd.8
217       rm -f ${OLDPREFIX}/sbin/sshd.exe
218       rm -f ${OLDPREFIX}/sbin/sftp-server.exe
219     fi
220     old_install=1
221   fi
222 fi
223
224 # First generate host keys if not already existing
225
226 if [ ! -f "${SYSCONFDIR}/ssh_host_key" ]
227 then
228   echo "Generating ${SYSCONFDIR}/ssh_host_key"
229   ssh-keygen -t rsa1 -f ${SYSCONFDIR}/ssh_host_key -N '' > /dev/null
230 fi
231
232 if [ ! -f "${SYSCONFDIR}/ssh_host_rsa_key" ]
233 then
234   echo "Generating ${SYSCONFDIR}/ssh_host_rsa_key"
235   ssh-keygen -t rsa -f ${SYSCONFDIR}/ssh_host_rsa_key -N '' > /dev/null
236 fi
237
238 if [ ! -f "${SYSCONFDIR}/ssh_host_dsa_key" ]
239 then
240   echo "Generating ${SYSCONFDIR}/ssh_host_dsa_key"
241   ssh-keygen -t dsa -f ${SYSCONFDIR}/ssh_host_dsa_key -N '' > /dev/null
242 fi
243
244 # Check if ssh_config exists. If yes, ask for overwriting
245
246 if [ -f "${SYSCONFDIR}/ssh_config" ]
247 then
248   if request "Overwrite existing ${SYSCONFDIR}/ssh_config file?"
249   then
250     rm -f "${SYSCONFDIR}/ssh_config"
251     if [ -f "${SYSCONFDIR}/ssh_config" ]
252     then
253       echo "Can't overwrite. ${SYSCONFDIR}/ssh_config is write protected."
254     fi
255   fi
256 fi
257
258 # Create default ssh_config from here script
259
260 if [ ! -f "${SYSCONFDIR}/ssh_config" ]
261 then
262   echo "Generating ${SYSCONFDIR}/ssh_config file"
263   cat > ${SYSCONFDIR}/ssh_config << EOF
264 # This is the ssh client system-wide configuration file.  See
265 # ssh_config(5) for more information.  This file provides defaults for
266 # users, and the values can be changed in per-user configuration files
267 # or on the command line.
268
269 # Configuration data is parsed as follows:
270 #  1. command line options
271 #  2. user-specific file
272 #  3. system-wide file
273 # Any configuration value is only changed the first time it is set.
274 # Thus, host-specific definitions should be at the beginning of the
275 # configuration file, and defaults at the end.
276
277 # Site-wide defaults for various options
278
279 # Host *
280 #   ForwardAgent no
281 #   ForwardX11 no
282 #   RhostsAuthentication no
283 #   RhostsRSAAuthentication no
284 #   RSAAuthentication yes
285 #   PasswordAuthentication yes
286 #   BatchMode no
287 #   CheckHostIP yes
288 #   StrictHostKeyChecking ask
289 #   IdentityFile ~/.ssh/identity
290 #   IdentityFile ~/.ssh/id_dsa
291 #   IdentityFile ~/.ssh/id_rsa
292 #   Port 22
293 #   Protocol 2,1
294 #   Cipher 3des
295 #   Ciphers aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour,aes192-cbc,aes256-cbc
296 #   EscapeChar ~
297 EOF
298   if [ "$port_number" != "22" ]
299   then
300     echo "Host localhost" >> ${SYSCONFDIR}/ssh_config
301     echo "    Port $port_number" >> ${SYSCONFDIR}/ssh_config
302   fi
303 fi
304
305 # Check if sshd_config exists. If yes, ask for overwriting
306
307 if [ -f "${SYSCONFDIR}/sshd_config" ]
308 then
309   if request "Overwrite existing ${SYSCONFDIR}/sshd_config file?"
310   then
311     rm -f "${SYSCONFDIR}/sshd_config"
312     if [ -f "${SYSCONFDIR}/sshd_config" ]
313     then
314       echo "Can't overwrite. ${SYSCONFDIR}/sshd_config is write protected."
315     fi
316   else
317     grep -q UsePrivilegeSeparation ${SYSCONFDIR}/sshd_config && privsep_configured=yes
318   fi
319 fi
320
321 # Prior to creating or modifying sshd_config, care for privilege separation
322
323 if [ "$privsep_configured" != "yes" ]
324 then
325   if [ $_nt -gt 0 ]
326   then
327     echo "Privilege separation is set to yes by default since OpenSSH 3.3."
328     echo "However, this requires a non-privileged account called 'sshd'."
329     echo "For more info on privilege separation read /usr/doc/openssh/README.privsep."
330     echo
331     if request "Shall privilege separation be used?"
332     then
333       privsep_used=yes
334       grep -q '^sshd:' ${SYSCONFDIR}/passwd && sshd_in_passwd=yes
335       net user sshd >/dev/null 2>&1 && sshd_in_sam=yes
336       if [ "$sshd_in_passwd" != "yes" ]
337       then
338         if [ "$sshd_in_sam" != "yes" ]
339         then
340           echo "Warning: The following function requires administrator privileges!"
341           if request "Shall this script create a local user 'sshd' on this machine?"
342           then
343             dos_var_empty=`cygpath -w /var/empty`
344             net user sshd /add /fullname:"sshd privsep" "/homedir:$dos_var_empty" /active:no > /dev/null 2>&1 && sshd_in_sam=yes
345             if [ "$sshd_in_sam" != "yes" ]
346             then
347               echo "Warning: Creating the user 'sshd' failed!"
348             fi
349           fi
350         fi
351         if [ "$sshd_in_sam" != "yes" ]
352         then
353           echo "Warning: Can't create user 'sshd' in ${SYSCONFDIR}/passwd!"
354           echo "         Privilege separation set to 'no' again!"
355           echo "         Check your ${SYSCONFDIR}/sshd_config file!"
356           privsep_used=no
357         else
358           mkpasswd -l -u sshd | sed -e 's/bash$/false/' >> ${SYSCONFDIR}/passwd
359         fi
360       fi
361     else
362       privsep_used=no
363     fi
364   else
365     # On 9x don't use privilege separation.  Since security isn't
366     # available it just adds useless addtional processes.
367     privsep_used=no
368   fi
369 fi
370
371 # Create default sshd_config from here script or modify to add the
372 # missing privsep configuration option
373
374 if [ ! -f "${SYSCONFDIR}/sshd_config" ]
375 then
376   echo "Generating ${SYSCONFDIR}/sshd_config file"
377   cat > ${SYSCONFDIR}/sshd_config << EOF
378 # This is the sshd server system-wide configuration file.  See
379 # sshd_config(5) for more information.
380
381 # The strategy used for options in the default sshd_config shipped with
382 # OpenSSH is to specify options with their default value where
383 # possible, but leave them commented.  Uncommented options change a
384 # default value.
385
386 Port $port_number
387 #Protocol 2,1
388 #ListenAddress 0.0.0.0
389 #ListenAddress ::
390
391 # HostKey for protocol version 1
392 #HostKey ${SYSCONFDIR}/ssh_host_key
393 # HostKeys for protocol version 2
394 #HostKey ${SYSCONFDIR}/ssh_host_rsa_key
395 #HostKey ${SYSCONFDIR}/ssh_host_dsa_key
396
397 # Lifetime and size of ephemeral version 1 server ke
398 #KeyRegenerationInterval 3600
399 #ServerKeyBits 768
400
401 # Logging
402 #obsoletes QuietMode and FascistLogging
403 #SyslogFacility AUTH
404 #LogLevel INFO
405
406 # Authentication:
407
408 #LoginGraceTime 600
409 #PermitRootLogin yes
410 # The following setting overrides permission checks on host key files
411 # and directories. For security reasons set this to "yes" when running
412 # NT/W2K, NTFS and CYGWIN=ntsec.
413 StrictModes no
414
415 #RSAAuthentication yes
416 #PubkeyAuthentication yes
417 #AuthorizedKeysFile     %h/.ssh/authorized_keys
418
419 # rhosts authentication should not be used
420 #RhostsAuthentication no
421 # Don't read ~/.rhosts and ~/.shosts files
422 #IgnoreRhosts yes
423 # For this to work you will also need host keys in ${SYSCONFDIR}/ssh_known_hosts
424 #RhostsRSAAuthentication no
425 # similar for protocol version 2
426 #HostbasedAuthentication no
427 # Change to yes if you don't trust ~/.ssh/known_hosts for
428 # RhostsRSAAuthentication and HostbasedAuthentication
429 #IgnoreUserKnownHosts no
430
431 # To disable tunneled clear text passwords, change to no here!
432 #PasswordAuthentication yes
433 #PermitEmptyPasswords no
434
435 # Change to no to disable s/key passwords
436 #ChallengeResponseAuthentication yes
437
438 #X11Forwarding no
439 #X11DisplayOffset 10
440 #X11UseLocalhost yes
441 #PrintMotd yes
442 #PrintLastLog yes
443 #KeepAlive yes
444 #UseLogin no
445 UsePrivilegeSeparation $privsep_used
446 #Compression yes
447
448 #MaxStartups 10
449 # no default banner path
450 #Banner /some/path
451 #VerifyReverseMapping no
452
453 # override default of no subsystems
454 Subsystem      sftp    /usr/sbin/sftp-server
455 EOF
456 elif [ "$privsep_configured" != "yes" ]
457 then
458   echo >> ${SYSCONFDIR}/sshd_config
459   echo "UsePrivilegeSeparation $privsep_used" >> ${SYSCONFDIR}/sshd_config
460 fi
461
462 # Care for services file
463 if [ $_nt -gt 0 ]
464 then
465   _wservices="${SYSTEMROOT}\\system32\\drivers\\etc\\services"
466   _wserv_tmp="${SYSTEMROOT}\\system32\\drivers\\etc\\srv.out.$$"
467 else
468   _wservices="${WINDIR}\\SERVICES"
469   _wserv_tmp="${WINDIR}\\SERV.$$"
470 fi
471 _services=`cygpath -u "${_wservices}"`
472 _serv_tmp=`cygpath -u "${_wserv_tmp}"`
473
474 mount -t -f "${_wservices}" "${_services}"
475 mount -t -f "${_wserv_tmp}" "${_serv_tmp}"
476
477 # Remove sshd 22/port from services
478 if [ `grep -q 'sshd[ \t][ \t]*22' "${_services}"; echo $?` -eq 0 ]
479 then
480   grep -v 'sshd[ \t][ \t]*22' "${_services}" > "${_serv_tmp}"
481   if [ -f "${_serv_tmp}" ]
482   then 
483     if mv "${_serv_tmp}" "${_services}"
484     then
485       echo "Removing sshd from ${_services}"
486     else
487       echo "Removing sshd from ${_services} failed\!"
488     fi 
489     rm -f "${_serv_tmp}"
490   else
491     echo "Removing sshd from ${_services} failed\!"
492   fi
493 fi
494
495 # Add ssh 22/tcp  and ssh 22/udp to services
496 if [ `grep -q 'ssh[ \t][ \t]*22' "${_services}"; echo $?` -ne 0 ]
497 then
498   awk '{ if ( $2 ~ /^23\/tcp/ ) print "ssh                22/tcp                           #SSH Remote Login Protocol\nssh                22/udp                           #SSH Remote Login Protocol"; print $0; }' < "${_services}" > "${_serv_tmp}"
499   if [ -f "${_serv_tmp}" ]
500   then
501     if mv "${_serv_tmp}" "${_services}"
502     then
503       echo "Added ssh to ${_services}"
504     else
505       echo "Adding ssh to ${_services} failed\!"
506     fi
507     rm -f "${_serv_tmp}"
508   else
509     echo "Adding ssh to ${_services} failed\!"
510   fi
511 fi
512
513 umount "${_services}"
514 umount "${_serv_tmp}"
515
516 # Care for inetd.conf file
517 _inetcnf="${SYSCONFDIR}/inetd.conf"
518 _inetcnf_tmp="${SYSCONFDIR}/inetd.conf.$$"
519
520 if [ -f "${_inetcnf}" ]
521 then
522   # Check if ssh service is already in use as sshd
523   with_comment=1
524   grep -q '^[ \t]*sshd' "${_inetcnf}" && with_comment=0
525   # Remove sshd line from inetd.conf
526   if [ `grep -q '^[# \t]*sshd' "${_inetcnf}"; echo $?` -eq 0 ]
527   then
528     grep -v '^[# \t]*sshd' "${_inetcnf}" >> "${_inetcnf_tmp}"
529     if [ -f "${_inetcnf_tmp}" ]
530     then
531       if mv "${_inetcnf_tmp}" "${_inetcnf}"
532       then
533         echo "Removed sshd from ${_inetcnf}"
534       else
535         echo "Removing sshd from ${_inetcnf} failed\!"
536       fi
537       rm -f "${_inetcnf_tmp}"
538     else
539       echo "Removing sshd from ${_inetcnf} failed\!"
540     fi
541   fi
542
543   # Add ssh line to inetd.conf
544   if [ `grep -q '^[# \t]*ssh' "${_inetcnf}"; echo $?` -ne 0 ]
545   then
546     if [ "${with_comment}" -eq 0 ]
547     then
548       echo 'ssh  stream  tcp     nowait  root    /usr/sbin/sshd sshd -i' >> "${_inetcnf}"
549     else
550       echo '# ssh  stream  tcp     nowait  root    /usr/sbin/sshd sshd -i' >> "${_inetcnf}"
551     fi
552     echo "Added ssh to ${_inetcnf}"
553   fi
554 fi
555
556 # On NT ask if sshd should be installed as service
557 if [ $_nt -gt 0 ]
558 then
559   echo
560   echo "Do you want to install sshd as service?"
561   if request "(Say \"no\" if it's already installed as service)"
562   then
563     echo
564     echo "Which value should the environment variable CYGWIN have when"
565     echo "sshd starts? It's recommended to set at least \"ntsec\" to be"
566     echo "able to change user context without password."
567     echo -n "Default is \"binmode ntsec tty\".  CYGWIN="
568     read _cygwin
569     [ -z "${_cygwin}" ] && _cygwin="binmode ntsec tty"
570     if cygrunsrv -I sshd -d "CYGWIN sshd" -p /usr/sbin/sshd -a -D -e "CYGWIN=${_cygwin}"
571     then
572       chown system ${SYSCONFDIR}/ssh*
573       echo
574       echo "The service has been installed under LocalSystem account."
575     fi
576   fi
577 fi
578
579 if [ "${old_install}" = "1" ]
580 then
581   echo
582   echo "Note: If you have used sshd as service or from inetd, don't forget to"
583   echo "      change the path to sshd.exe in the service entry or in inetd.conf."
584 fi
585
586 echo
587 echo "Host configuration finished. Have fun!"
This page took 1.884063 seconds and 3 git commands to generate.