Project

General

Profile

Download (8.44 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/.ssh/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
	fclose($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
	fclose($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 .= "PasswordAuthentication yes\n";
91
	$sshconf .= "Compression yes\n";
92
	$sshconf .= "ClientAliveInterval 30\n";
93
	$sshconf .= "UseDNS no\n";
94
	$sshconf .= "X11Forwarding no\n";
95
	$sshconf .= "# override default of no subsystems\n";
96
	$sshconf .= "Subsystem       sftp    /usr/libexec/sftp-server\n";
97
	/* Only allow protocol 2, because we say so */
98
	$sshconf .= "Protocol 2\n";
99
	/* Run the server on another port if we have one defined */
100
	$sshconf .= "Port $sshport\n";
101

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

    
107
	/* mop up from a badly implemented ssh keys -> cf backup */
108
	if($config['ssh']['dsa_key'] <> "") {
109
		unset($config['ssh']['dsa_key']);
110
		unset($config['ssh']['rsa_key']);
111
		unset($config['ssh']['rsa1_key']);
112
		unset($config['ssh']['dsa']);
113
		unset($config['ssh']['rsa']);
114
		unset($config['ssh']['rsa1']);
115
		unset($config['ssh']['ak']);
116
		write_config("Clearing SSH keys from config.xml");
117
	}
118

    
119
	/* are we already running?  if so exit */
120
	if(file_exists("/tmp/keys_generating"))
121
		exit;
122

    
123
	if (!file_exists("$sshConfigDir/ssh_host_key") or file_exists("/etc/keys_generating")) {
124
		/* remove previous keys and regen later */
125
		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", "");
126
		conf_mount_rw();
127
		mwexec("rm /etc/ssh/ssh_host_*");
128
		touch("/etc/keys_generating");
129
		touch("/tmp/keys_generating");
130
		echo " Generating Keys:\n";
131
		system("/usr/bin/nice -n20 /usr/bin/ssh-keygen -t rsa1 -N '' -f $sshConfigDir/ssh_host_key");
132
		system("/usr/bin/nice -n20 /usr/bin/ssh-keygen -t rsa -N '' -f $sshConfigDir/ssh_host_rsa_key");
133
		system("/usr/bin/nice -n20 /usr/bin/ssh-keygen -t dsa -N '' -f $sshConfigDir/ssh_host_dsa_key");
134
		unlink("/etc/keys_generating");
135
		unlink("/tmp/keys_generating");
136
		file_notice("SSH", "pfSense has completed creating your SSH keys.  SSH is now started.", "SSH Startup", "");
137
		echo "Starting SSH... ";
138
	}
139

    
140
	/* kill existing sshd process, server only, not the childs */
141
	$sshd_pid = exec("ps ax | egrep '/usr/sbin/[s]shd' | awk '{print $1}'");
142
	if($sshd_pid <> "") {
143
		echo "stopping ssh process $sshd_pid \n";
144
		mwexec("kill $sshd_pid");
145
	}
146
	/* Launch new server process */
147
	$status = mwexec("/usr/sbin/sshd");
148
	if($status <> 0) {
149
		file_notice("sshd_startup", "SSHD failed to start.", "SSHD Daemon", "");
150
		echo "error!\n";
151
	} else {
152
		echo "done.\n";
153
	}
154

    
155
	conf_mount_ro();
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

    
194
	exit;
195

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

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

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

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

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

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

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

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

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

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

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

    
268
?>
(69-69/76)