mirror of
https://gitlab.com/openconnect/ocserv.git
synced 2026-10-12 01:26:48 +08:00
made the ban points configurable
This commit is contained in:
@@ -222,6 +222,11 @@ max-ban-score = 50
|
|||||||
# The time (in seconds) that all score kept for a client is reset.
|
# The time (in seconds) that all score kept for a client is reset.
|
||||||
ban-reset-time = 300
|
ban-reset-time = 300
|
||||||
|
|
||||||
|
# In case you'd like to change the default points.
|
||||||
|
#ban-points-wrong-password = 10
|
||||||
|
#ban-points-connection = 1
|
||||||
|
#ban-points-kkdcp = 1
|
||||||
|
|
||||||
# Cookie timeout (in seconds)
|
# Cookie timeout (in seconds)
|
||||||
# Once a client is authenticated he's provided a cookie with
|
# Once a client is authenticated he's provided a cookie with
|
||||||
# which he can reconnect. That cookie will be invalided if not
|
# which he can reconnect. That cookie will be invalided if not
|
||||||
|
|||||||
@@ -80,6 +80,9 @@ static struct cfg_options available_options[] = {
|
|||||||
{ .name = "no-compress-limit", .type = OPTION_NUMERIC, .mandatory = 0 },
|
{ .name = "no-compress-limit", .type = OPTION_NUMERIC, .mandatory = 0 },
|
||||||
{ .name = "tcp-port", .type = OPTION_NUMERIC, .mandatory = 0 },
|
{ .name = "tcp-port", .type = OPTION_NUMERIC, .mandatory = 0 },
|
||||||
{ .name = "max-ban-score", .type = OPTION_NUMERIC, .mandatory = 0 },
|
{ .name = "max-ban-score", .type = OPTION_NUMERIC, .mandatory = 0 },
|
||||||
|
{ .name = "ban-points-wrong-password", .type = OPTION_NUMERIC, .mandatory = 0 },
|
||||||
|
{ .name = "ban-connection", .type = OPTION_NUMERIC, .mandatory = 0 },
|
||||||
|
{ .name = "ban-points-kkdcp", .type = OPTION_NUMERIC, .mandatory = 0 },
|
||||||
{ .name = "udp-port", .type = OPTION_NUMERIC, .mandatory = 0 },
|
{ .name = "udp-port", .type = OPTION_NUMERIC, .mandatory = 0 },
|
||||||
{ .name = "keepalive", .type = OPTION_NUMERIC, .mandatory = 0 },
|
{ .name = "keepalive", .type = OPTION_NUMERIC, .mandatory = 0 },
|
||||||
{ .name = "dpd", .type = OPTION_NUMERIC, .mandatory = 0 },
|
{ .name = "dpd", .type = OPTION_NUMERIC, .mandatory = 0 },
|
||||||
@@ -827,6 +830,13 @@ unsigned urlfw_size = 0;
|
|||||||
if (config->max_ban_score == -1)
|
if (config->max_ban_score == -1)
|
||||||
config->max_ban_score = DEFAULT_MAX_BAN_SCORE;
|
config->max_ban_score = DEFAULT_MAX_BAN_SCORE;
|
||||||
|
|
||||||
|
config->ban_points_wrong_password = DEFAULT_PASSWORD_POINTS;
|
||||||
|
READ_NUMERIC("ban-points-wrong-password", config->ban_points_wrong_password);
|
||||||
|
config->ban_points_connect = DEFAULT_CONNECT_POINTS;
|
||||||
|
READ_NUMERIC("ban-points-connection", config->ban_points_connect);
|
||||||
|
config->ban_points_kkdcp = DEFAULT_KKDCP_POINTS;
|
||||||
|
READ_NUMERIC("ban-points-kkdcp", config->ban_points_kkdcp);
|
||||||
|
|
||||||
READ_NUMERIC("max-same-clients", config->max_same_clients);
|
READ_NUMERIC("max-same-clients", config->max_same_clients);
|
||||||
|
|
||||||
val = get_option("run-as-user", NULL);
|
val = get_option("run-as-user", NULL);
|
||||||
|
|||||||
+1
-1
@@ -194,7 +194,7 @@ unsigned check_if_banned(main_server_st *s, struct sockaddr_storage *addr, sockl
|
|||||||
|
|
||||||
if (human_addr2((struct sockaddr*)addr, addr_size, t.ip, sizeof(t.ip), 0) != NULL) {
|
if (human_addr2((struct sockaddr*)addr, addr_size, t.ip, sizeof(t.ip), 0) != NULL) {
|
||||||
/* add its current connection points */
|
/* add its current connection points */
|
||||||
add_ip_to_ban_list(s, t.ip, CONNECT_POINTS);
|
add_ip_to_ban_list(s, t.ip, s->config->ban_points_connect);
|
||||||
|
|
||||||
now = time(0);
|
now = time(0);
|
||||||
e = htable_get(db, rehash(&t, NULL), ban_entry_cmp, &t);
|
e = htable_get(db, rehash(&t, NULL), ban_entry_cmp, &t);
|
||||||
|
|||||||
@@ -297,6 +297,11 @@ max-ban-score = 50
|
|||||||
# The time (in seconds) that all score kept for a client is reset.
|
# The time (in seconds) that all score kept for a client is reset.
|
||||||
ban-reset-time = 300
|
ban-reset-time = 300
|
||||||
|
|
||||||
|
# In case you'd like to change the default points.
|
||||||
|
#ban-points-wrong-password = 10
|
||||||
|
#ban-points-connection = 1
|
||||||
|
#ban-points-kkdcp = 1
|
||||||
|
|
||||||
# Cookie timeout (in seconds)
|
# Cookie timeout (in seconds)
|
||||||
# Once a client is authenticated he's provided a cookie with
|
# Once a client is authenticated he's provided a cookie with
|
||||||
# which he can reconnect. That cookie will be invalided if not
|
# which he can reconnect. That cookie will be invalided if not
|
||||||
|
|||||||
+2
-2
@@ -322,7 +322,7 @@ int handle_sec_auth_res(int cfd, sec_mod_st * sec, client_entry_st * e, int resu
|
|||||||
if (result == ERR_AUTH_CONTINUE) {
|
if (result == ERR_AUTH_CONTINUE) {
|
||||||
/* if the module allows multiple retries for the password */
|
/* if the module allows multiple retries for the password */
|
||||||
if (e->status != PS_AUTH_INIT && e->module && e->module->allows_retries) {
|
if (e->status != PS_AUTH_INIT && e->module && e->module->allows_retries) {
|
||||||
ret = sec_mod_add_score_to_ip(sec, e, e->auth_info.remote_ip, PASSWORD_POINTS);
|
ret = sec_mod_add_score_to_ip(sec, e, e->auth_info.remote_ip, sec->config->ban_points_wrong_password);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
e->status = PS_AUTH_FAILED;
|
e->status = PS_AUTH_FAILED;
|
||||||
return send_sec_auth_reply(cfd, sec, e, AUTH__REP__FAILED);
|
return send_sec_auth_reply(cfd, sec, e, AUTH__REP__FAILED);
|
||||||
@@ -355,7 +355,7 @@ int handle_sec_auth_res(int cfd, sec_mod_st * sec, client_entry_st * e, int resu
|
|||||||
} else {
|
} else {
|
||||||
e->status = PS_AUTH_FAILED;
|
e->status = PS_AUTH_FAILED;
|
||||||
|
|
||||||
sec_mod_add_score_to_ip(sec, e, e->auth_info.remote_ip, PASSWORD_POINTS);
|
sec_mod_add_score_to_ip(sec, e, e->auth_info.remote_ip, sec->config->ban_points_wrong_password);
|
||||||
|
|
||||||
ret = send_sec_auth_reply(cfd, sec, e, AUTH__REP__FAILED);
|
ret = send_sec_auth_reply(cfd, sec, e, AUTH__REP__FAILED);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
|||||||
@@ -61,10 +61,10 @@ typedef enum {
|
|||||||
* attempt gives you PASSWORD_POINTS, and you are banned
|
* attempt gives you PASSWORD_POINTS, and you are banned
|
||||||
* when the maximum ban score is reached.
|
* when the maximum ban score is reached.
|
||||||
*/
|
*/
|
||||||
#define PASSWORD_POINTS 10
|
#define DEFAULT_PASSWORD_POINTS 10
|
||||||
#define CONNECT_POINTS 1
|
#define DEFAULT_CONNECT_POINTS 1
|
||||||
#define KKDCP_POINTS 1
|
#define DEFAULT_KKDCP_POINTS 1
|
||||||
#define DEFAULT_MAX_BAN_SCORE (MAX_PASSWORD_TRIES*PASSWORD_POINTS)
|
#define DEFAULT_MAX_BAN_SCORE (MAX_PASSWORD_TRIES*DEFAULT_PASSWORD_POINTS)
|
||||||
#define DEFAULT_BAN_RESET_TIME 300
|
#define DEFAULT_BAN_RESET_TIME 300
|
||||||
|
|
||||||
#define MIN_NO_COMPRESS_LIMIT 64
|
#define MIN_NO_COMPRESS_LIMIT 64
|
||||||
@@ -327,6 +327,10 @@ struct cfg_st {
|
|||||||
int max_ban_score; /* the score allowed before a user is banned (see vpn.h) */
|
int max_ban_score; /* the score allowed before a user is banned (see vpn.h) */
|
||||||
int ban_reset_time;
|
int ban_reset_time;
|
||||||
|
|
||||||
|
unsigned ban_points_wrong_password;
|
||||||
|
unsigned ban_points_connect;
|
||||||
|
unsigned ban_points_kkdcp;
|
||||||
|
|
||||||
unsigned isolate; /* whether seccomp should be enabled or not */
|
unsigned isolate; /* whether seccomp should be enabled or not */
|
||||||
|
|
||||||
unsigned auth_timeout; /* timeout of HTTP auth */
|
unsigned auth_timeout; /* timeout of HTTP auth */
|
||||||
@@ -364,7 +368,7 @@ struct cfg_st {
|
|||||||
|
|
||||||
char *connect_script;
|
char *connect_script;
|
||||||
char *disconnect_script;
|
char *disconnect_script;
|
||||||
|
|
||||||
char *cgroup;
|
char *cgroup;
|
||||||
char *proxy_url;
|
char *proxy_url;
|
||||||
|
|
||||||
@@ -384,7 +388,7 @@ struct cfg_st {
|
|||||||
char *default_user_conf;
|
char *default_user_conf;
|
||||||
|
|
||||||
bool gssapi_no_local_user_map;
|
bool gssapi_no_local_user_map;
|
||||||
|
|
||||||
/* the tun network */
|
/* the tun network */
|
||||||
struct vpn_st network;
|
struct vpn_st network;
|
||||||
};
|
};
|
||||||
|
|||||||
+1
-1
@@ -140,7 +140,7 @@ int post_kkdcp_handler(worker_st *ws, unsigned http_ver)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ws_add_score_to_ip(ws, KKDCP_POINTS, 0);
|
ws_add_score_to_ip(ws, ws->config->ban_points_kkdcp, 0);
|
||||||
oclog(ws, LOG_HTTP_DEBUG, "HTTP processing kkdcp framed request: %u bytes", (unsigned)req->body_length);
|
oclog(ws, LOG_HTTP_DEBUG, "HTTP processing kkdcp framed request: %u bytes", (unsigned)req->body_length);
|
||||||
|
|
||||||
ret = der_decode((uint8_t*)req->body, req->body_length, buf, &length, realm, sizeof(realm), &e);
|
ret = der_decode((uint8_t*)req->body, req->body_length, buf, &length, realm, sizeof(realm), &e);
|
||||||
|
|||||||
+1
-1
@@ -251,7 +251,7 @@ void ws_add_score_to_ip(worker_st *ws, unsigned points, unsigned final)
|
|||||||
if (final == 0) {
|
if (final == 0) {
|
||||||
ws->ban_points += points;
|
ws->ban_points += points;
|
||||||
/* do not use IPC for small values */
|
/* do not use IPC for small values */
|
||||||
if (points < PASSWORD_POINTS)
|
if (points < ws->config->ban_points_wrong_password)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user