diff --git a/adradius b/adradius new file mode 100755 index 0000000..c607e56 Binary files /dev/null and b/adradius differ diff --git a/cmd/adradius/adradius.go b/cmd/adradius/adradius.go new file mode 100644 index 0000000..0ec4477 --- /dev/null +++ b/cmd/adradius/adradius.go @@ -0,0 +1,18 @@ +package main + +import ( + "log" + + "git.paulbsd.com/paulbsd/adradius/src/adradius" + "git.paulbsd.com/paulbsd/adradius/src/config" +) + +func main() { + var cfg config.Config + err := cfg.GetConfig() + if err != nil { + log.Fatal(err) + } + ldapcfg := adradius.SetADRadiusConfig(&cfg) + adradius.RunServer(&cfg, ldapcfg) +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..cc2343e --- /dev/null +++ b/go.mod @@ -0,0 +1,11 @@ +module git.paulbsd.com/paulbsd/adradius + +go 1.13 + +require ( + github.com/korylprince/go-ad-auth v2.2.0+incompatible + golang.org/x/text v0.3.2 // indirect + gopkg.in/ini.v1 v1.52.0 + gopkg.in/ldap.v3 v3.1.0 // indirect + layeh.com/radius v0.0.0-20190322222518-890bc1058917 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..14dfb38 --- /dev/null +++ b/go.sum @@ -0,0 +1,13 @@ +github.com/korylprince/go-ad-auth v2.2.0+incompatible h1:g/vTHSQfe2y0D9LATowYJwj735wLjD+pBS9fN7Ady70= +github.com/korylprince/go-ad-auth v2.2.0+incompatible/go.mod h1:mMfgOVgAwVJiM4rureWH1QSktKw9tEe0dAbT7ObIzfM= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d h1:TxyelI5cVkbREznMhfzycHdkp5cLA7DpE+GKjSslYhM= +gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= +gopkg.in/ini.v1 v1.52.0 h1:j+Lt/M1oPPejkniCg1TkWE2J3Eh1oZTsHSXzMTzUXn4= +gopkg.in/ini.v1 v1.52.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ldap.v3 v3.1.0 h1:DIDWEjI7vQWREh0S8X5/NFPCZ3MCVd55LmXKPW4XLGE= +gopkg.in/ldap.v3 v3.1.0/go.mod h1:dQjCc0R0kfyFjIlWNMH1DORwUASZyDxo2Ry1B51dXaQ= +layeh.com/radius v0.0.0-20190322222518-890bc1058917 h1:BDXFaFzUt5EIqe/4wrTc4AcYZWP6iC6Ult+jQWLh5eU= +layeh.com/radius v0.0.0-20190322222518-890bc1058917/go.mod h1:fywZKyu//X7iRzaxLgPWsvc0L26IUpVvE/aeIL2JtIQ= diff --git a/cmd/adradius/main.go b/src/adradius/adradius.go similarity index 56% rename from cmd/adradius/main.go rename to src/adradius/adradius.go index 32c29c3..1e0881b 100644 --- a/cmd/adradius/main.go +++ b/src/adradius/adradius.go @@ -1,50 +1,38 @@ -package main +package adradius import ( + "fmt" "log" + "git.paulbsd.com/paulbsd/adradius/src/config" auth "github.com/korylprince/go-ad-auth" "layeh.com/radius" "layeh.com/radius/rfc2865" ) -func main() { +// SetADRadiusConfig +func SetADRadiusConfig(c *config.Config) (ldapconfig *auth.Config) { + var security auth.SecurityType - config := &auth.Config{ - Server: "ldap.example.com", - Port: 389, - BaseDN: "OU=Users,DC=example,DC=com", - //Security: auth.SecurityStartTLS, + if c.TLS { + security = auth.SecurityTLS + } else { + security = auth.SecurityNone } - handler := func(w radius.ResponseWriter, r *radius.Request) { - username := rfc2865.UserName_GetString(r.Packet) - password := rfc2865.UserPassword_GetString(r.Packet) - - var code radius.Code - - status, _ := ADauth(config, username, password) - - if status { - code = radius.CodeAccessAccept - } else { - code = radius.CodeAccessReject - } - log.Printf("Writing %v to %v", code, r.RemoteAddr) - w.Write(r.Response(code)) + ldapconfig = &auth.Config{ + Server: c.Server, + Port: c.Port, + BaseDN: c.BaseDN, + Security: security, } - server := radius.PacketServer{ - Handler: radius.HandlerFunc(handler), - SecretSource: radius.StaticSecretSource([]byte(`secret`)), - } + fmt.Println(ldapconfig) - log.Printf("Starting server on :1812") - if err := server.ListenAndServe(); err != nil { - log.Fatal(err) - } + return } +// ADauth func ADauth(config *auth.Config, username string, password string) (status bool, err error) { status, err = auth.Authenticate(config, username, password) //if err != nil { @@ -57,3 +45,34 @@ func ADauth(config *auth.Config, username string, password string) (status bool, //} return } + +// RunServer +func RunServer(config *config.Config, ldapconfig *auth.Config) { + handler := func(w radius.ResponseWriter, r *radius.Request) { + username := rfc2865.UserName_GetString(r.Packet) + password := rfc2865.UserPassword_GetString(r.Packet) + + var code radius.Code + + status, _ := ADauth(ldapconfig, username, password) + + if status { + code = radius.CodeAccessAccept + } else { + code = radius.CodeAccessReject + } + log.Printf("Writing %v to %v", code, r.RemoteAddr) + w.Write(r.Response(code)) + } + + server := radius.PacketServer{ + Addr: config.Listen, + Handler: radius.HandlerFunc(handler), + SecretSource: radius.StaticSecretSource([]byte(config.Secret)), + } + + log.Printf("Starting server on %s", config.Listen) + if err := server.ListenAndServe(); err != nil { + log.Fatal(err) + } +} diff --git a/src/config/main.go b/src/config/main.go new file mode 100644 index 0000000..7b345a7 --- /dev/null +++ b/src/config/main.go @@ -0,0 +1,48 @@ +package config + +import ( + "flag" + + "git.paulbsd.com/paulbsd/adradius/utils" + auth "github.com/korylprince/go-ad-auth" + "gopkg.in/ini.v1" +) + +// GetConfig fetch config from ini file +func (c *Config) GetConfig() (err error) { + flag.Usage = utils.Usage + + flag.StringVar(&c.ConfigPath, "configfile", "common.ini", "config file to use with adradius section") + flag.Parse() + + config, err := ini.Load(c.ConfigPath) + if err != nil { + return + } + + adradiusSection := config.Section("adradius") + c.Server = adradiusSection.Key("server").MustString("localhost") + c.Port = adradiusSection.Key("port").MustInt(389) + c.BaseDN = adradiusSection.Key("basedn").MustString("dc=example,dc=com") + c.TLS = adradiusSection.Key("tls").MustBool() + c.Listen = adradiusSection.Key("listen").MustString(":1812") + c.Secret = adradiusSection.Key("secret").MustString("secret") + + if err != nil { + return + } + + return nil +} + +// Config is the main configuration +type Config struct { + ConfigPath string + Server string + Port int + BaseDN string + TLS bool + Listen string + Secret string + Security auth.SecurityType +} diff --git a/test.ini b/test.ini new file mode 100644 index 0000000..6e3df4d --- /dev/null +++ b/test.ini @@ -0,0 +1,7 @@ +[adradius] +server=localhost +port=389 +basedn=dc=example,dc=com +secret=secret +tls=true +listen=localhost:1812 diff --git a/utils/utils.go b/utils/utils.go new file mode 100644 index 0000000..d6f52a5 --- /dev/null +++ b/utils/utils.go @@ -0,0 +1,12 @@ +package utils + +import ( + "flag" + "os" +) + +// Usage displays possible arguments +func Usage() { + flag.PrintDefaults() + os.Exit(1) +}