In this example, I will share how to authenticate SIP REGISTER and SIP INVITE against a database containing username, password and IP address. I have kamailio configured to use auth_db, usrloc, ipops (for IP restriction).
Here are snippets from the main config script, kamailio.cfg:
...
modparam("auth_db|usrloc", "db_url", DB_URL)
modparam("auth_db", "use_domain", 1)
modparam("auth_db", "calculate_ha1", 1)
modparam("auth_db", "user_column", "extension")
modparam("auth_db", "domain_column", "domain_name")
modparam("auth_db", "password_column", "password")
modparam("auth_db", "load_credentials", "$var(ip)=ip_address")
...
if (is_method("REGISTER")) {
# auth user/pass
if(!www_authenticate("$fd", "user_extension")) {
www_challenge("$fd", "1");
}
# apply IP auth
if (ip_type("$var(ip)") && !is_in_subnet("$si", "$var(ip)")) {
sl_send_reply( "403", "IP forbidden" );
exit;
}
if (!save("sip_registration")) {
sl_reply_error();
}
exit;
}
...
if (is_method("INVITE")) {
if (!proxy_authenticate("$fd", "user_extension")) {
proxy_challenge("$fd", "1");
exit;
}
if (ip_type("$var(ip)") && !is_in_subnet("$si", "$var(ip)")) {
sl_send_reply( "403", "IP forbidden" );
exit;
}
# INVITE authenticated at this point,
# continue processing packet in next lines
#
# ...
}
...
Here is my database schema for postgresql:
--
-- CREATE THE AUTO-INCREMENT SEQUENCE FOR TABLE
--
DROP SEQUENCE IF EXISTS public.user_extension_id CASCADE;
CREATE SEQUENCE public.user_extension_id
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9223372036854775807
START WITH 1
CACHE 1
NO CYCLE
OWNED BY NONE;
ALTER SEQUENCE public.user_extension_id OWNER TO kamailio;
--
-- CREATE THE TABLE
--
DROP TABLE IF EXISTS public.user_extension CASCADE;
CREATE TABLE public.user_extension(
user_extension_id integer NOT NULL DEFAULT nextval('user_extension_id'::regclass),
domain_name VARCHAR(64) DEFAULT '' NOT NULL,
extension text,
password text,
ip_address text,
CONSTRAINT user_extension_pkey PRIMARY KEY (user_extension_id),
CONSTRAINT user_extension_key UNIQUE (domain_name,extension)
);
ALTER TABLE public.user_extension OWNER TO kamailio;
--
-- INSERT EXAMPLE USER
--
INSERT INTO user_extension (domain_name, extension, password, ip_address) VALUES ('sip.domain', '1000', '1000TEST1000', '192.168.0.11');
Assuming you have everything else setup correctly in Kamailio, you should be able to register to the proxy using username '1000', password '1000TEST1000' and from only the IP address '192.168.0.11'
*Please note you can use CIDR notation to allow whole subnets like 192.168.0.0/24