Project

General

Profile

Download (8.42 KB) Statistics
| Branch: | Tag: | Revision:
1
#! /usr/local/bin/php -f
2
<?php
3
/*
4
	sshd - Modified to work on disk based system
5
	Copyright 2004 Scott K Ullrich
6

    
7
	Original Copyright (C) 2004 Fred Mol <fredmol@xs4all.nl>.
8
	All rights reserved.
9

    
10
	Redistribution and use in source and binary forms, with or without
11
	modification, are permitted provided that the following conditions are met:
12

    
13
	1. Redistributions of source code must retain the above copyright notice,
14
	   this list of conditions and the following disclaimer.
15

    
16
	2. Redistributions in binary form must reproduce the above copyright
17
	   notice, this list of conditions and the following disclaimer in the
18
	   documentation and/or other materials provided with the distribution.
19

    
20
	THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
21
	INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
22
	AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
23
	AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
24
	OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
	SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
	INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
	CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
	POSSIBILITY OF SUCH DAMAGE.
30
*/
31
	require_once("config.inc");
32
	require_once("notices.inc");
33

    
34
	if(isset($config['system']['enablesshd'])) {
35
		/* do nothing, we're enabled */
36
	} else {
37
		if($g['booting'])
38
			echo "SSHD is disabled.";
39
		exit;
40
	}
41
	
42
	function file_size($file) {
43
	  $size = filesize($file);
44
	  return $size;
45
	}
46

    
47
	/*    if any of these files are 0 bytes then they are corrupted.
48
	 *    remove them
49
	 */
50
	$files_to_check = array('ssh_host_dsa_key','ssh_host_dsa_key.pub','ssh_host_key','ssh_host_key.pub','ssh_host_rsa_key','ssh_host_rsa_key.pub','/root/.authorized_keys');
51
	foreach($files_to_check as $f2c) {
52
		if(file_exists("/etc/ssh/{$f2c}"))
53
			if(file_size("/etc/ssh/{$f2c}")==0) {
54
				mwexec("rm /etc/ssh/ssh_host*");
55
			}
56
	}
57

    
58
	if (!is_dir("/var/empty")) {
59
		/* make ssh home directory */
60
		mkdir("/var/empty", 0555);
61
	}
62

    
63
	if(!file_exists("")) {
64
		/* Login related files. */
65
		touch("/var/log/lastlog");
66
	}
67

    
68
	/* Make the root passwords are the same as the web admin password. */
69
	conf_mount_rw();
70
	$fd = popen("/usr/sbin/pw usermod -n root -H 0", "w");
71
	fwrite($fd, $config['system']['password']);
72
	pclose($fd);
73

    
74
	/* Make the admin passwords are the same as the web admin password. */
75
	$fd = popen("/usr/sbin/pw usermod -n admin -H 0", "w");
76
	fwrite($fd, $config['system']['password']);
77
	pclose($fd);
78

    
79
	$sshConfigDir = "/etc/ssh";
80

    
81
	if($config['system']['ssh']['port'] <> "") {
82
		$sshport = $config['system']['ssh']['port'];
83
	} else {
84
		$sshport = 22;
85
	}
86

    
87
	/* Include default configuration for pfSense */
88
	$sshconf = "# This file is automatically generated at startup\n";
89
	$sshconf .= "PermitRootLogin yes\n";
90
	$sshconf .= "Compression yes\n";
91
	$sshconf .= "ClientAliveInterval 30\n";
92
	$sshconf .= "UseDNS no\n";
93
	$sshconf .= "X11Forwarding no\n";
94
	$sshconf .= "# override default of no subsystems\n";
95
	$sshconf .= "Subsystem       sftp    /usr/libexec/sftp-server\n";
96
	/* Only allow protocol 2, because we say so */
97
	$sshconf .= "Protocol 2\n";
98
	/* Run the server on another port if we have one defined */
99
	$sshconf .= "Port $sshport\n";
100

    
101
	/* Write the new sshd config file */
102
	$fd = fopen("/etc/ssh/sshd_config", "w");
103
	fwrite($fd, $sshconf);
104
	pclose($fd);
105

    
106
	/* mop up from a badly implemented ssh keys -> cf backup */
107
	if($config['ssh']['dsa_key'] <> "") {
108
		unset($config['ssh']['dsa_key']);
109
		unset($config['ssh']['rsa_key']);
110
		unset($config['ssh']['rsa1_key']);
111
		unset($config['ssh']['dsa']);
112
		unset($config['ssh']['rsa']);
113
		unset($config['ssh']['rsa1']);
114
		unset($config['ssh']['ak']);
115
		write_config("Clearing SSH keys from config.xml");
116
	}
117
	
118
	/* are we already running?  if so exit */
119
	if(file_exists("/tmp/keys_generating"))
120
		exit;
121
	
122
	if (!file_exists("$sshConfigDir/ssh_host_key") or file_exists("/etc/keys_generating")) {
123
		/* remove previous keys and regen later */
124
		file_notice("SSH", "pfSense has started creating your SSH keys.  SSH Startup will be delayed.  Please note that reloading the filter rules and changes will be delayed until this operation is completed.", "SSH KeyGen", "");
125
		conf_mount_rw();
126
		mwexec("rm /etc/ssh/ssh_host_*");
127
		touch("/etc/keys_generating");
128
		touch("/tmp/keys_generating");
129
		echo " Generating Keys:\n";
130
		system("/usr/bin/nice -n20 /usr/bin/ssh-keygen -t rsa1 -N '' -f $sshConfigDir/ssh_host_key");
131
		system("/usr/bin/nice -n20 /usr/bin/ssh-keygen -t rsa -N '' -f $sshConfigDir/ssh_host_rsa_key");
132
		system("/usr/bin/nice -n20 /usr/bin/ssh-keygen -t dsa -N '' -f $sshConfigDir/ssh_host_dsa_key");
133
		unlink("/etc/keys_generating");
134
		unlink("/tmp/keys_generating");
135
		file_notice("SSH", "pfSense has completed creating your SSH keys.  SSH is now started.", "SSH Startup", "");
136
		echo "Starting SSH... ";
137
	}
138

    
139
	/* kill existing sshd process, server only, not the childs */
140
	$sshd_pid = exec("ps ax | egrep '/usr/sbin/[s]shd' | awk '{print $1}'");
141
	if($sshd_pid <> "") {
142
		echo "stopping ssh process $sshd_pid \n";
143
		mwexec("kill $sshd_pid");
144
	}
145
	/* Launch new server process */
146
	$status = mwexec("/usr/sbin/sshd");
147
	if($status <> 0) {
148
		file_notice("sshd_startup", "SSHD failed to start.", "SSHD Daemon", "");
149
		echo "error!\n";
150
	} else {
151
		echo "done.\n";
152
	}
153
	
154
	conf_mount_ro();
155
	
156
	
157
	
158
	
159
	
160
	
161
	
162
	
163
	
164
	
165
	
166
	
167
	
168
	
169
	
170
	
171
	
172
	
173
	
174
	
175
	
176
	
177
	
178
	
179
	
180
	
181
	
182
	
183
	
184
	
185
	
186
	
187
	
188
	
189
	
190
	
191
	
192
	
193
	exit;
194

    
195
	/* exit early, this needs more testing. */
196

    
197
	if (!file_exists("$sshConfigDir/ssh_host_key") and $config['ssh']['dsa'] == "") {
198
		/* generate keys */
199
		system("/usr/bin/nice -n20 /usr/bin/ssh-keygen -t rsa1 -N '' -f $sshConfigDir/ssh_host_key");
200
		system("/usr/bin/nice -n20 /usr/bin/ssh-keygen -t rsa -N '' -f $sshConfigDir/ssh_host_rsa_key");
201
		system("/usr/bin/nice -n20 /usr/bin/ssh-keygen -t dsa -N '' -f $sshConfigDir/ssh_host_dsa_key");
202

    
203
		/* save keys */
204
		$dsa  = file_get_contents("{$sshConfigDir}/ssh_host_dsa_key");
205
		$rsa  = file_get_contents("{$sshConfigDir}/ssh_host_rsa_key");
206
		$rsa1 = file_get_contents("{$sshConfigDir}/ssh_host_key");
207
		$config['ssh']['dsa'] = base64_encode($dsa);
208
		$config['ssh']['rsa'] = base64_encode($rsa);
209
		$config['ssh']['rsa1']= base64_encode($rsa1);
210

    
211
		/* save public keys */
212
		$dsapub  = file_get_contents("{$sshConfigDir}/ssh_host_dsa_key.pub");
213
		$rsapub  = file_get_contents("{$sshConfigDir}/ssh_host_rsa_key.pub");
214
		$rsa1pub = file_get_contents("{$sshConfigDir}/ssh_host_key.pub");
215
		$config['ssh']['dsa_key'] = base64_encode($dsapub);
216
		$config['ssh']['rsa_key'] = base64_encode($rsapub);
217
		$config['ssh']['rsa1_key']= base64_encode($rsa1pub);
218
		write_config("Saved SSH keys.");
219
	} else {
220
		/* restore keys */
221
		$rsa1 = base64_decode($config['ssh']['rsa1']);
222
		$rsa  = base64_decode($config['ssh']['rsa']);
223
		$dsa  = base64_decode($config['ssh']['dsa']);
224
		file_put_contents("{$sshConfigDir}/ssh_host_key", $rsa1);
225
		file_put_contents("{$sshConfigDir}/ssh_host_rsa_key", $rsa);
226
		file_put_contents("{$sshConfigDir}/ssh_host_dsa_key", $dsa);
227

    
228
		/* restore public keys */
229
		$rsa1_pub = base64_decode($config['ssh']['rsa1_key']);
230
		$rsa_pub  = base64_decode($config['ssh']['rsa_key']);
231
		$dsa_pub  = base64_decode($config['ssh']['dsa_key']);
232
		file_put_contents("{$sshConfigDir}/ssh_host_key.pub", $rsa1_pub);
233
		file_put_contents("{$sshConfigDir}/ssh_host_rsa_key.pub", $rsa_pub);
234
		file_put_contents("{$sshConfigDir}/ssh_host_dsa_key.pub", $dsa_pub);
235

    
236
		/* change keys owner to root */
237
		chown("{$sshConfigDir}/ssh_host_key", "root");
238
		chown("{$sshConfigDir}/ssh_host_rsa_key", "root");
239
		chown("{$sshConfigDir}/ssh_host_dsa_key", "root");
240

    
241
		/* change public keys owner to root */
242
		chown("{$sshConfigDir}/ssh_host_key.pub", "root");
243
		chown("{$sshConfigDir}/ssh_host_rsa_key.pub", "root");
244
		chown("{$sshConfigDir}/ssh_host_dsa_key.pub", "root");
245

    
246
		/* change mode on keys to u+rw */
247
		chmod("{$sshConfigDir}/ssh_host_key",0600);
248
		chmod("{$sshConfigDir}/ssh_host_rsa_key",0600);
249
		chmod("{$sshConfigDir}/ssh_host_dsa_key",0600);
250

    
251
		/* change mode on public keys to u+rw */
252
		chmod("{$sshConfigDir}/ssh_host_key.pub",0600);
253
		chmod("{$sshConfigDir}/ssh_host_rsa_key.pub",0600);
254
		chmod("{$sshConfigDir}/ssh_host_dsa_key.pub",0600);
255
	}
256

    
257
	if($config['ssh']['ak'] <> "") {
258
		$ak  = base64_decode($config['ssh']['ak']);
259
		file_put_contents("/root/.authorized_keys", $ak);
260
		chmod("/root/.authorized_keys",0600);
261
	}
262

    
263
	/* start sshd */
264
	system("/usr/sbin/sshd");
265
	echo "done.\n";
266

    
267
?>
(64-64/71)