Después de mucho buscar y mucho probar, he conseguido validar contra un servidor Radius de un cliente.
Partiendo de la libreria http://rubyforge.org/projects/ruby-radius/, y con un tcpdump esnifando paquetes UDP, al final he conseguido validar.
Partiendo de la libreria http://rubyforge.org/projects/ruby-radius/, y con un tcpdump esnifando paquetes UDP, al final he conseguido validar.
He tenido que modificar el fichero auth.rb de la libreria:
-- attr_reader :@packet
++ attr_reader :packet
y en packet.rb, en el metodo "each":
-- @attributes.each_pair {
-- |key, value|
-- yield(key, value)
-- }
++ sorted_attributes = @attributes.keys.sort_by{|item| ++@dict.attr_num(item)}
++ sorted_attributes.each{|item|
++ key = item
++ value = @attributes[key]
++
++ yield(key, value)
++ }
para que se envien ordenados los atributos del paquete Radius.
Ahora puedes hacer una clase como:
require 'radius/auth'
class RadiusAuthentication
def initialize(hostname, secret)
@hostname, @secret = hostname, secret
@dictionary = File.join(File.dirname(__FILE__), 'dictionary')
end
def authenticate(username, password, nasip=nil, timeout=nil)
nasip = nasip || '127.0.0.1'
timeout = timeout || 10
rad = Radius::Auth.new(@dictionary, @hostname, nasip, timeout)
return rad.check_passwd(username, password, @secret)
end
end
y en tu código de aplicación:
rad = RadiusAuthentication.new(RADIUS_SERVER, RADIUS_SECRET)
success = rad.authenticate(login, password)
Y así validas la password contra el servidor Radius. Utiliza tcpdump para ver los paquetes UDP enviados y recibidos:
tcpdump udp and port 1812 -vvv
No hay comentarios:
Publicar un comentario