summaryrefslogtreecommitdiff
path: root/contrib/cygwin/ssh-host-config
diff options
context:
space:
mode:
authorDamien Miller <djm@mindrot.org>2014-05-27 14:31:58 +1000
committerDamien Miller <djm@mindrot.org>2014-05-27 14:31:58 +1000
commitf9eb5e0734f7a7f6e975809eb54684d2a06a7ffc (patch)
tree70106db653a4859b9ea8fbbc77afc8a05cb0ef2f /contrib/cygwin/ssh-host-config
parenteae88744662e6b149f43ef071657727f1a157d95 (diff)
- (djm) [contrib/cygwin/ssh-host-config] Updated Cygwin ssh-host-config
from Corinna Vinschen, fixing a number of bugs and preparing for Cygwin 1.7.30.
Diffstat (limited to 'contrib/cygwin/ssh-host-config')
-rw-r--r--contrib/cygwin/ssh-host-config166
1 files changed, 102 insertions, 64 deletions
diff --git a/contrib/cygwin/ssh-host-config b/contrib/cygwin/ssh-host-config
index 05efd3b3b..fed87947d 100644
--- a/contrib/cygwin/ssh-host-config
+++ b/contrib/cygwin/ssh-host-config
@@ -34,6 +34,7 @@ declare -a csih_required_commands=(
34 /usr/bin/mv coreutils 34 /usr/bin/mv coreutils
35 /usr/bin/rm coreutils 35 /usr/bin/rm coreutils
36 /usr/bin/cygpath cygwin 36 /usr/bin/cygpath cygwin
37 /usr/bin/mkpasswd cygwin
37 /usr/bin/mount cygwin 38 /usr/bin/mount cygwin
38 /usr/bin/ps cygwin 39 /usr/bin/ps cygwin
39 /usr/bin/setfacl cygwin 40 /usr/bin/setfacl cygwin
@@ -59,8 +60,9 @@ PREFIX=/usr
59SYSCONFDIR=/etc 60SYSCONFDIR=/etc
60LOCALSTATEDIR=/var 61LOCALSTATEDIR=/var
61 62
63sshd_config_configured=no
62port_number=22 64port_number=22
63privsep_configured=no 65strictmodes=yes
64privsep_used=yes 66privsep_used=yes
65cygwin_value="" 67cygwin_value=""
66user_account= 68user_account=
@@ -89,28 +91,8 @@ update_services_file() {
89 # Depends on the above mount 91 # Depends on the above mount
90 _wservices=`cygpath -w "${_services}"` 92 _wservices=`cygpath -w "${_services}"`
91 93
92 # Remove sshd 22/port from services
93 if [ `/usr/bin/grep -q 'sshd[ \t][ \t]*22' "${_services}"; echo $?` -eq 0 ]
94 then
95 /usr/bin/grep -v 'sshd[ \t][ \t]*22' "${_services}" > "${_serv_tmp}"
96 if [ -f "${_serv_tmp}" ]
97 then
98 if /usr/bin/mv "${_serv_tmp}" "${_services}"
99 then
100 csih_inform "Removing sshd from ${_wservices}"
101 else
102 csih_warning "Removing sshd from ${_wservices} failed!"
103 let ++ret
104 fi
105 /usr/bin/rm -f "${_serv_tmp}"
106 else
107 csih_warning "Removing sshd from ${_wservices} failed!"
108 let ++ret
109 fi
110 fi
111
112 # Add ssh 22/tcp and ssh 22/udp to services 94 # Add ssh 22/tcp and ssh 22/udp to services
113 if [ `/usr/bin/grep -q 'ssh[ \t][ \t]*22' "${_services}"; echo $?` -ne 0 ] 95 if [ `/usr/bin/grep -q 'ssh[[:space:]][[:space:]]*22' "${_services}"; echo $?` -ne 0 ]
114 then 96 then
115 if /usr/bin/awk '{ if ( $2 ~ /^23\/tcp/ ) print "ssh 22/tcp'"${_spaces}"'SSH Remote Login Protocol\nssh 22/udp'"${_spaces}"'SSH Remote Login Protocol"; print $0; }' < "${_services}" > "${_serv_tmp}" 97 if /usr/bin/awk '{ if ( $2 ~ /^23\/tcp/ ) print "ssh 22/tcp'"${_spaces}"'SSH Remote Login Protocol\nssh 22/udp'"${_spaces}"'SSH Remote Login Protocol"; print $0; }' < "${_services}" > "${_serv_tmp}"
116 then 98 then
@@ -132,17 +114,45 @@ update_services_file() {
132} # --- End of update_services_file --- # 114} # --- End of update_services_file --- #
133 115
134# ====================================================================== 116# ======================================================================
117# Routine: sshd_strictmodes
118# MODIFIES: strictmodes
119# ======================================================================
120sshd_strictmodes() {
121 if [ "${sshd_config_configured}" != "yes" ]
122 then
123 echo
124 csih_inform "StrictModes is set to 'yes' by default."
125 csih_inform "This is the recommended setting, but it requires that the POSIX"
126 csih_inform "permissions of the user's home directory, the user's .ssh"
127 csih_inform "directory, and the user's ssh key files are tight so that"
128 csih_inform "only the user has write permissions."
129 csih_inform "On the other hand, StrictModes don't work well with default"
130 csih_inform "Windows permissions of a home directory mounted with the"
131 csih_inform "'noacl' option, and they don't work at all if the home"
132 csih_inform "directory is on a FAT or FAT32 partition."
133 if ! csih_request "Should StrictModes be used?"
134 then
135 strictmodes=no
136 fi
137 fi
138 return 0
139}
140
141# ======================================================================
135# Routine: sshd_privsep 142# Routine: sshd_privsep
136# MODIFIES: privsep_configured privsep_used 143# MODIFIES: privsep_used
137# ====================================================================== 144# ======================================================================
138sshd_privsep() { 145sshd_privsep() {
139 local sshdconfig_tmp
140 local ret=0 146 local ret=0
141 147
142 if [ "${privsep_configured}" != "yes" ] 148 if [ "${sshd_config_configured}" != "yes" ]
143 then 149 then
144 csih_inform "Privilege separation is set to yes by default since OpenSSH 3.3." 150 echo
145 csih_inform "However, this requires a non-privileged account called 'sshd'." 151 csih_inform "Privilege separation is set to 'sandbox' by default since"
152 csih_inform "OpenSSH 6.1. This is unsupported by Cygwin and has to be set"
153 csih_inform "to 'yes' or 'no'."
154 csih_inform "However, using privilege separation requires a non-privileged account"
155 csih_inform "called 'sshd'."
146 csih_inform "For more info on privilege separation read /usr/share/doc/openssh/README.privsep." 156 csih_inform "For more info on privilege separation read /usr/share/doc/openssh/README.privsep."
147 if csih_request "Should privilege separation be used?" 157 if csih_request "Should privilege separation be used?"
148 then 158 then
@@ -159,36 +169,53 @@ sshd_privsep() {
159 privsep_used=no 169 privsep_used=no
160 fi 170 fi
161 fi 171 fi
172 return $ret
173} # --- End of sshd_privsep --- #
174
175# ======================================================================
176# Routine: sshd_config_tweak
177# ======================================================================
178sshd_config_tweak() {
179 local ret=0
162 180
163 # Create default sshd_config from skeleton files in /etc/defaults/etc or 181 # Modify sshd_config
164 # modify to add the missing privsep configuration option 182 csih_inform "Updating ${SYSCONFDIR}/sshd_config file"
165 if /usr/bin/cmp "${SYSCONFDIR}/sshd_config" "${SYSCONFDIR}/defaults/${SYSCONFDIR}/sshd_config" >/dev/null 2>&1 183 if [ "${port_number}" -ne 22 ]
166 then 184 then
167 csih_inform "Updating ${SYSCONFDIR}/sshd_config file" 185 /usr/bin/sed -i -e "s/^#\?[[:space:]]*Port[[:space:]].*/Port ${port_number}/" \
168 sshdconfig_tmp=${SYSCONFDIR}/sshd_config.$$ 186 ${SYSCONFDIR}/sshd_config
169 /usr/bin/sed -e "s/^#UsePrivilegeSeparation yes/UsePrivilegeSeparation ${privsep_used}/ 187 if [ $? -ne 0 ]
170 s/^#Port 22/Port ${port_number}/
171 s/^#StrictModes yes/StrictModes no/" \
172 < ${SYSCONFDIR}/sshd_config \
173 > "${sshdconfig_tmp}"
174 if ! /usr/bin/mv "${sshdconfig_tmp}" ${SYSCONFDIR}/sshd_config
175 then 188 then
176 csih_warning "Setting privilege separation to 'yes' failed!" 189 csih_warning "Setting listening port to ${port_number} failed!"
177 csih_warning "Check your ${SYSCONFDIR}/sshd_config file!" 190 csih_warning "Check your ${SYSCONFDIR}/sshd_config file!"
178 let ++ret 191 let ++ret
179 fi 192 fi
180 elif [ "${privsep_configured}" != "yes" ] 193 fi
194 if [ "${strictmodes}" = "no" ]
181 then 195 then
182 echo >> ${SYSCONFDIR}/sshd_config 196 /usr/bin/sed -i -e "s/^#\?[[:space:]]*StrictModes[[:space:]].*/StrictModes no/" \
183 if ! echo "UsePrivilegeSeparation ${privsep_used}" >> ${SYSCONFDIR}/sshd_config 197 ${SYSCONFDIR}/sshd_config
198 if [ $? -ne 0 ]
184 then 199 then
185 csih_warning "Setting privilege separation to 'yes' failed!" 200 csih_warning "Setting StrictModes to 'no' failed!"
186 csih_warning "Check your ${SYSCONFDIR}/sshd_config file!" 201 csih_warning "Check your ${SYSCONFDIR}/sshd_config file!"
187 let ++ret 202 let ++ret
203 fi
204 fi
205 if [ "${sshd_config_configured}" != "yes" ]
206 then
207 /usr/bin/sed -i -e "
208 s/^#\?UsePrivilegeSeparation .*/UsePrivilegeSeparation ${privsep_used}/" \
209 ${SYSCONFDIR}/sshd_config
210 if [ $? -ne 0 ]
211 then
212 csih_warning "Setting privilege separation failed!"
213 csih_warning "Check your ${SYSCONFDIR}/sshd_config file!"
214 let ++ret
188 fi 215 fi
189 fi 216 fi
190 return $ret 217 return $ret
191} # --- End of sshd_privsep --- # 218} # --- End of sshd_config_tweak --- #
192 219
193# ====================================================================== 220# ======================================================================
194# Routine: update_inetd_conf 221# Routine: update_inetd_conf
@@ -207,11 +234,11 @@ update_inetd_conf() {
207 # we have inetutils-1.5 inetd.d support 234 # we have inetutils-1.5 inetd.d support
208 if [ -f "${_inetcnf}" ] 235 if [ -f "${_inetcnf}" ]
209 then 236 then
210 /usr/bin/grep -q '^[ \t]*ssh' "${_inetcnf}" && _with_comment=0 237 /usr/bin/grep -q '^[[:space:]]*ssh' "${_inetcnf}" && _with_comment=0
211 238
212 # check for sshd OR ssh in top-level inetd.conf file, and remove 239 # check for sshd OR ssh in top-level inetd.conf file, and remove
213 # will be replaced by a file in inetd.d/ 240 # will be replaced by a file in inetd.d/
214 if [ `/usr/bin/grep -q '^[# \t]*ssh' "${_inetcnf}"; echo $?` -eq 0 ] 241 if [ $(/usr/bin/grep -q '^[# \t]*ssh' "${_inetcnf}"; echo $?) -eq 0 ]
215 then 242 then
216 /usr/bin/grep -v '^[# \t]*ssh' "${_inetcnf}" >> "${_inetcnf_tmp}" 243 /usr/bin/grep -v '^[# \t]*ssh' "${_inetcnf}" >> "${_inetcnf_tmp}"
217 if [ -f "${_inetcnf_tmp}" ] 244 if [ -f "${_inetcnf_tmp}" ]
@@ -236,9 +263,9 @@ update_inetd_conf() {
236 then 263 then
237 if [ "${_with_comment}" -eq 0 ] 264 if [ "${_with_comment}" -eq 0 ]
238 then 265 then
239 /usr/bin/sed -e 's/@COMMENT@[ \t]*//' < "${_sshd_inetd_conf}" > "${_sshd_inetd_conf_tmp}" 266 /usr/bin/sed -e 's/@COMMENT@[[:space:]]*//' < "${_sshd_inetd_conf}" > "${_sshd_inetd_conf_tmp}"
240 else 267 else
241 /usr/bin/sed -e 's/@COMMENT@[ \t]*/# /' < "${_sshd_inetd_conf}" > "${_sshd_inetd_conf_tmp}" 268 /usr/bin/sed -e 's/@COMMENT@[[:space:]]*/# /' < "${_sshd_inetd_conf}" > "${_sshd_inetd_conf_tmp}"
242 fi 269 fi
243 if /usr/bin/mv "${_sshd_inetd_conf_tmp}" "${_sshd_inetd_conf}" 270 if /usr/bin/mv "${_sshd_inetd_conf_tmp}" "${_sshd_inetd_conf}"
244 then 271 then
@@ -251,13 +278,13 @@ update_inetd_conf() {
251 278
252 elif [ -f "${_inetcnf}" ] 279 elif [ -f "${_inetcnf}" ]
253 then 280 then
254 /usr/bin/grep -q '^[ \t]*sshd' "${_inetcnf}" && _with_comment=0 281 /usr/bin/grep -q '^[[:space:]]*sshd' "${_inetcnf}" && _with_comment=0
255 282
256 # check for sshd in top-level inetd.conf file, and remove 283 # check for sshd in top-level inetd.conf file, and remove
257 # will be replaced by a file in inetd.d/ 284 # will be replaced by a file in inetd.d/
258 if [ `/usr/bin/grep -q '^[# \t]*sshd' "${_inetcnf}"; echo $?` -eq 0 ] 285 if [ `/usr/bin/grep -q '^#\?[[:space:]]*sshd' "${_inetcnf}"; echo $?` -eq 0 ]
259 then 286 then
260 /usr/bin/grep -v '^[# \t]*sshd' "${_inetcnf}" >> "${_inetcnf_tmp}" 287 /usr/bin/grep -v '^#\?[[:space:]]*sshd' "${_inetcnf}" >> "${_inetcnf_tmp}"
261 if [ -f "${_inetcnf_tmp}" ] 288 if [ -f "${_inetcnf_tmp}" ]
262 then 289 then
263 if /usr/bin/mv "${_inetcnf_tmp}" "${_inetcnf}" 290 if /usr/bin/mv "${_inetcnf_tmp}" "${_inetcnf}"
@@ -305,17 +332,26 @@ check_service_files_ownership() {
305 332
306 if [ -z "${run_service_as}" ] 333 if [ -z "${run_service_as}" ]
307 then 334 then
308 accnt_name=$(/usr/bin/cygrunsrv -VQ sshd | /usr/bin/sed -ne 's/^Account *: *//gp') 335 accnt_name=$(/usr/bin/cygrunsrv -VQ sshd |
336 /usr/bin/sed -ne 's/^Account *: *//gp')
309 if [ "${accnt_name}" = "LocalSystem" ] 337 if [ "${accnt_name}" = "LocalSystem" ]
310 then 338 then
311 # Convert "LocalSystem" to "SYSTEM" as is the correct account name 339 # Convert "LocalSystem" to "SYSTEM" as is the correct account name
312 accnt_name="SYSTEM:" 340 run_service_as="SYSTEM"
313 elif [[ "${accnt_name}" =~ ^\.\\ ]] 341 else
314 then 342 dom="${accnt_name%%\\*}"
315 # Convert "." domain to local machine name 343 accnt_name="${accnt_name#*\\}"
316 accnt_name="U-${COMPUTERNAME}${accnt_name#.}," 344 if [ "${dom}" = '.' ]
345 then
346 # Check local account
347 run_service_as=$(/usr/bin/mkpasswd -l -u "${accnt_name}" |
348 /usr/bin/awk -F: '{print $1;}')
349 else
350 # Check domain
351 run_service_as=$(/usr/bin/mkpasswd -d "${dom}" -u "${accnt_name}" |
352 /usr/bin/awk -F: '{print $1;}')
353 fi
317 fi 354 fi
318 run_service_as=$(/usr/bin/grep -Fi "${accnt_name}" /etc/passwd | /usr/bin/awk -F: '{print $1;}')
319 if [ -z "${run_service_as}" ] 355 if [ -z "${run_service_as}" ]
320 then 356 then
321 csih_warning "Couldn't determine name of user running sshd service from /etc/passwd!" 357 csih_warning "Couldn't determine name of user running sshd service from /etc/passwd!"
@@ -672,6 +708,7 @@ then
672fi 708fi
673 709
674# generate missing host keys 710# generate missing host keys
711csih_inform "Generating missing SSH host keys"
675/usr/bin/ssh-keygen -A || let warning_cnt+=$? 712/usr/bin/ssh-keygen -A || let warning_cnt+=$?
676 713
677# handle ssh_config 714# handle ssh_config
@@ -690,10 +727,11 @@ fi
690csih_install_config "${SYSCONFDIR}/sshd_config" "${SYSCONFDIR}/defaults" || let ++warning_cnt 727csih_install_config "${SYSCONFDIR}/sshd_config" "${SYSCONFDIR}/defaults" || let ++warning_cnt
691if ! /usr/bin/cmp "${SYSCONFDIR}/sshd_config" "${SYSCONFDIR}/defaults/${SYSCONFDIR}/sshd_config" >/dev/null 2>&1 728if ! /usr/bin/cmp "${SYSCONFDIR}/sshd_config" "${SYSCONFDIR}/defaults/${SYSCONFDIR}/sshd_config" >/dev/null 2>&1
692then 729then
693 /usr/bin/grep -q UsePrivilegeSeparation ${SYSCONFDIR}/sshd_config && privsep_configured=yes 730 sshd_config_configured=yes
694fi 731fi
732sshd_strictmodes || let warning_cnt+=$?
695sshd_privsep || let warning_cnt+=$? 733sshd_privsep || let warning_cnt+=$?
696 734sshd_config_tweak || let warning_cnt+=$?
697update_services_file || let warning_cnt+=$? 735update_services_file || let warning_cnt+=$?
698update_inetd_conf || let warning_cnt+=$? 736update_inetd_conf || let warning_cnt+=$?
699install_service || let warning_cnt+=$? 737install_service || let warning_cnt+=$?