Project

General

Profile

Download (5.18 KB) Statistics
| Branch: | Tag: | Revision:
1
#!/usr/local/bin/php-cgi -f
2
<?php
3
/*
4
	ipsec.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
/*
57
 * ipsec calls this script to authenticate a user
58
 * based on a username and password. We lookup these
59
 * in our config.xml file and check the credentials.
60
 */
61

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

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

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

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

    
103
if (isset($_GET['username'])) {
104
	$authmodes = explode(",", $_GET['authcfg']);
105
	$username = $_GET['username'];
106
	$password = $_GET['password'];
107
	$common_name = $_GET['cn'];
108
} else {
109
	/* read data from environment */
110
	$username = getenv("username");
111
	$password = getenv("password");
112
	$common_name = getenv("common_name");
113
	$authmodes = explode(",", getenv("authcfg"));
114
}
115

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

    
128
$authenticated = false;
129

    
130
if (($strictusercn === true) && ($common_name != $username)) {
131
	syslog(LOG_WARNING, "Username does not match certificate common name ({$username} != {$common_name}), access denied.\n");
132
	if (isset($_GET['username'])) {
133
		echo "FAILED";
134
		closelog();
135
		return;
136
	} else {
137
		closelog();
138
		exit (1);
139
	}
140
}
141

    
142
$attributes = array();
143
foreach ($authmodes as $authmode) {
144
	$authcfg = auth_get_authserver($authmode);
145
	if (!$authcfg && $authmode != "Local Database") {
146
		continue;
147
	}
148

    
149
	$authenticated = authenticate_user($username, $password, $authcfg, $attributes);
150
	if ($authenticated == true) {
151
		if ($authmode == "Local Database") {
152
			$user = getUserEntry($username);
153
			if (!is_array($user) || !userHasPrivilege($user, "user-ipsec-xauth-dialin")) {
154
				$authenticated = false;
155
				syslog(LOG_WARNING, "user '{$username}' cannot authenticate through IPsec since the required privileges are missing.\n");
156
				continue;
157
			}
158
		}
159
		break;
160
	}
161
}
162

    
163
if ($authenticated == false) {
164
	syslog(LOG_WARNING, "user '{$username}' could not authenticate.\n");
165
	if (isset($_GET['username'])) {
166
		echo "FAILED";
167
		closelog();
168
		return;
169
	} else {
170
		closelog();
171
		exit (-1);
172
	}
173
}
174

    
175
if (file_exists("/etc/inc/ipsec.attributes.php")) {
176
	include_once("/etc/inc/ipsec.attributes.php");
177
}
178

    
179
syslog(LOG_NOTICE, "user '{$username}' authenticated\n");
180
closelog();
181

    
182
if (isset($_GET['username'])) {
183
	echo "OK";
184
} else {
185
	exit (0);
186
}
187

    
188
?>
(27-27/65)