Project

General

Profile

Download (6.35 KB) Statistics
| Branch: | Tag: | Revision:
1
#!/usr/local/bin/php-cgi -f
2
<?php
3
/*
4
	openvpn.auth-user.php
5

    
6
	part of pfSense (https://www.pfsense.org)
7
	Copyright (C) 2008 Shrew Soft Inc
8
	Copyright (c) 2008-2016 Electric Sheep Fencing, LLC.
9
	All rights reserved.
10

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

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

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

    
22
	3. All advertising materials mentioning features or use of this software
23
	   must display the following acknowledgment:
24
	   "This product includes software developed by the pfSense Project
25
	   for use in the pfSense® software distribution. (http://www.pfsense.org/).
26

    
27
	4. The names "pfSense" and "pfSense Project" must not be used to
28
	   endorse or promote products derived from this software without
29
	   prior written permission. For written permission, please contact
30
	   coreteam@pfsense.org.
31

    
32
	5. Products derived from this software may not be called "pfSense"
33
	   nor may "pfSense" appear in their names without prior written
34
	   permission of the Electric Sheep Fencing, LLC.
35

    
36
	6. Redistributions of any form whatsoever must retain the following
37
	   acknowledgment:
38

    
39
	"This product includes software developed by the pfSense Project
40
	for use in the pfSense software distribution (http://www.pfsense.org/).
41

    
42
	THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
43
	EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
44
	IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
45
	PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE pfSense PROJECT OR
46
	ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
47
	SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
48
	NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
49
	LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
50
	HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
51
	STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
52
	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
53
	OF THE POSSIBILITY OF SUCH DAMAGE.
54
*/
55
/*
56
 * OpenVPN calls this script to authenticate a user
57
 * based on a username and password. We lookup these
58
 * in our config.xml file and check the credentials.
59
 */
60

    
61
require_once("globals.inc");
62
require_once("config.inc");
63
require_once("radius.inc");
64
require_once("auth.inc");
65
require_once("interfaces.inc");
66

    
67
/**
68
 * Get the NAS-Identifier
69
 *
70
 * We will use our local hostname to make up the nas_id
71
 */
72
if (!function_exists("getNasID")) {
73
function getNasID() {
74
	global $g;
75

    
76
	$nasId = gethostname();
77
	if (empty($nasId)) {
78
		$nasId = $g['product_name'];
79
	}
80
	return $nasId;
81
}
82
}
83

    
84
/**
85
 * Get the NAS-IP-Address based on the current wan address
86
 *
87
 * Use functions in interfaces.inc to find this out
88
 *
89
 */
90
if (!function_exists("getNasIP")) {
91
function getNasIP() {
92
	$nasIp = get_interface_ip();
93
	if (!$nasIp) {
94
		$nasIp = "0.0.0.0";
95
	}
96
	return $nasIp;
97
}
98
}
99
/* setup syslog logging */
100
openlog("openvpn", LOG_ODELAY, LOG_AUTH);
101

    
102
if (isset($_GET['username'])) {
103
	$authmodes = explode(",", $_GET['authcfg']);
104
	/* Any string retrieved through $_GET is automatically urlDecoded */
105
	$username = base64_decode($_GET['username']);
106
	$password = base64_decode($_GET['password']);
107
	$common_name = $_GET['cn'];
108
	$modeid = $_GET['modeid'];
109
	$strictusercn = $_GET['strictcn'] == "false" ? false : true;
110
} else {
111
	/* read data from environment */
112
	$username = getenv("username");
113
	$password = getenv("password");
114
	$common_name = getenv("common_name");
115
}
116

    
117
if (!$username || !$password) {
118
	syslog(LOG_ERR, "invalid user authentication environment");
119
	if (isset($_GET['username'])) {
120
		echo "FAILED";
121
		closelog();
122
		return;
123
	} else {
124
		closelog();
125
		return (-1);
126
	}
127
}
128

    
129
/* Replaced by a sed with proper variables used below(ldap parameters). */
130
//<template>
131

    
132
if (file_exists("{$g['varetc_path']}/openvpn/{$modeid}.ca")) {
133
	putenv("LDAPTLS_CACERT={$g['varetc_path']}/openvpn/{$modeid}.ca");
134
	putenv("LDAPTLS_REQCERT=never");
135
}
136

    
137
$authenticated = false;
138

    
139
if (($strictusercn === true) && (mb_strtolower($common_name) !== mb_strtolower($username))) {
140
	syslog(LOG_WARNING, "Username does not match certificate common name ({$username} != {$common_name}), access denied.\n");
141
	if (isset($_GET['username'])) {
142
		echo "FAILED";
143
		closelog();
144
		return;
145
	} else {
146
		closelog();
147
		return (1);
148
	}
149
}
150

    
151
if (!is_array($authmodes)) {
152
	syslog(LOG_WARNING, "No authentication server has been selected to authenticate against. Denying authentication for user {$username}");
153
	if (isset($_GET['username'])) {
154
		echo "FAILED";
155
		closelog();
156
		return;
157
	} else {
158
		closelog();
159
		return (1);
160
	}
161
}
162

    
163
$attributes = array();
164
foreach ($authmodes as $authmode) {
165
	$authcfg = auth_get_authserver($authmode);
166
	if (!$authcfg && $authmode != "Local Database") {
167
		continue;
168
	}
169

    
170
	$authenticated = authenticate_user($username, $password, $authcfg, $attributes);
171
	if ($authenticated == true) {
172
		break;
173
	}
174
}
175

    
176
if ($authenticated == false) {
177
	syslog(LOG_WARNING, "user '{$username}' could not authenticate.\n");
178
	if (isset($_GET['username'])) {
179
		echo "FAILED";
180
		closelog();
181
		return;
182
	} else {
183
		closelog();
184
		return (-1);
185
	}
186
}
187

    
188
if (file_exists("/etc/inc/openvpn.attributes.php")) {
189
	include_once("/etc/inc/openvpn.attributes.php");
190
}
191

    
192
$content = "";
193
if (is_array($attributes['dns-servers'])) {
194
	foreach ($attributes['dns-servers'] as $dnssrv) {
195
		if (is_ipaddr($dnssrv)) {
196
			$content .= "push \"dhcp-option DNS {$dnssrv}\"\n";
197
		}
198
	}
199
}
200
if (is_array($attributes['routes'])) {
201
	foreach ($attributes['routes'] as $route) {
202
		$content .= "push \"route {$route} vpn_gateway\"\n";
203
	}
204
}
205

    
206
if (isset($attributes['framed_ip'])) {
207
	if (isset($attributes['framed_mask'])) {
208
		$content .= "topology subnet\n";
209
		$content .= "ifconfig-push {$attributes['framed_ip']} {$attributes['framed_mask']}";
210
	} else {
211
		$content .= "topology net30\n";
212
		$content .= "ifconfig-push {$attributes['framed_ip']} ". long2ip((ip2long($attributes['framed_ip']) - 1));
213
	}
214
}
215

    
216
if (!empty($content)) {
217
	@file_put_contents("{$g['tmp_path']}/{$username}", $content);
218
}
219

    
220
syslog(LOG_NOTICE, "user '{$username}' authenticated\n");
221
closelog();
222

    
223
if (isset($_GET['username'])) {
224
	echo "OK";
225
} else {
226
	return (0);
227
}
228

    
229
?>
(36-36/65)