LDAP Connection
This commit is contained in:
parent
a1228eddc3
commit
6471da80cb
1
k8s.yaml
1
k8s.yaml
|
@ -5,6 +5,7 @@ metadata:
|
||||||
data:
|
data:
|
||||||
config.yaml: |
|
config.yaml: |
|
||||||
web: 0.0.0.0:5555
|
web: 0.0.0.0:5555
|
||||||
|
path: /
|
||||||
servers:
|
servers:
|
||||||
- ldaps://ldap1.example.com:636
|
- ldaps://ldap1.example.com:636
|
||||||
- ldaps://ldap2.example.com:636
|
- ldaps://ldap2.example.com:636
|
||||||
|
|
|
@ -28,6 +28,7 @@ type TimeoutConfig struct {
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
Web string `yaml:"web"`
|
Web string `yaml:"web"`
|
||||||
|
Path string `yaml:"path"`
|
||||||
Servers []string `yaml:"servers"`
|
Servers []string `yaml:"servers"`
|
||||||
Auth AuthConfig `yaml:"auth"`
|
Auth AuthConfig `yaml:"auth"`
|
||||||
User UserConfig `yaml:"user"`
|
User UserConfig `yaml:"user"`
|
||||||
|
|
82
src/ldap.go
Normal file
82
src/ldap.go
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/tls"
|
||||||
|
"fmt"
|
||||||
|
"math/rand"
|
||||||
|
"regexp"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
ldap "gopkg.in/ldap.v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
var conn *ldap.Conn
|
||||||
|
|
||||||
|
func setupLDAP() error {
|
||||||
|
size := len(config.Servers)
|
||||||
|
if size == 0 {
|
||||||
|
return fmt.Errorf("No LDAP server available on %+v", config)
|
||||||
|
}
|
||||||
|
|
||||||
|
r := rand.New(rand.NewSource(time.Now().Unix()))
|
||||||
|
portExp := regexp.MustCompile(`:[0-9]+$`)
|
||||||
|
|
||||||
|
server := config.Servers[r.Intn(size)]
|
||||||
|
url := server
|
||||||
|
port := 0
|
||||||
|
schema := "auto"
|
||||||
|
|
||||||
|
if strings.HasPrefix(url, "ldaps:") {
|
||||||
|
url = strings.TrimPrefix(strings.TrimPrefix(url, "ldaps:"), "//")
|
||||||
|
schema = "ldaps"
|
||||||
|
port = 636
|
||||||
|
} else if strings.HasPrefix(url, "ldap:") {
|
||||||
|
url = strings.TrimPrefix(strings.TrimPrefix(url, "ldap:"), "//")
|
||||||
|
schema = "ldap"
|
||||||
|
port = 389
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
if portExp.MatchString(url) {
|
||||||
|
str := portExp.FindString(url)
|
||||||
|
port, err = strconv.Atoi(str[1:])
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("Unable to parse url \"%s\", %v", server, err)
|
||||||
|
}
|
||||||
|
url = strings.TrimSuffix(url, str)
|
||||||
|
}
|
||||||
|
|
||||||
|
if schema == "auto" {
|
||||||
|
if port == 636 {
|
||||||
|
schema = "ldaps"
|
||||||
|
} else if port == 389 {
|
||||||
|
schema = "ldap"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if schema == "auto" || port == 0 {
|
||||||
|
return fmt.Errorf("Unable to determine schema or port for \"%s\"", server)
|
||||||
|
}
|
||||||
|
|
||||||
|
address := fmt.Sprintf("%s:%d", url, port)
|
||||||
|
fmt.Printf("Connecting LDAP %s...\n", address)
|
||||||
|
|
||||||
|
if schema == "ldaps" {
|
||||||
|
conn, err = ldap.DialTLS("tcp", address, &tls.Config{InsecureSkipVerify: true})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
conn, err = ldap.Dial("tcp", address)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = conn.StartTLS(&tls.Config{InsecureSkipVerify: true})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
38
src/main.go
38
src/main.go
|
@ -5,13 +5,29 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"time"
|
||||||
|
|
||||||
yaml "gopkg.in/yaml.v2"
|
yaml "gopkg.in/yaml.v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
configFile = flag.String("config", "/etc/nginx-ldap-auth/config.yaml", "Configuration file")
|
configFile = flag.String("config", "/etc/nginx-ldap-auth/config.yaml", "Configuration file")
|
||||||
config Config
|
config = Config{
|
||||||
|
Web: "0.0.0.0:5555",
|
||||||
|
Path: "/",
|
||||||
|
User: UserConfig{
|
||||||
|
UserAttr: "uid",
|
||||||
|
},
|
||||||
|
Group: GroupConfig{
|
||||||
|
UserAttr: "uid",
|
||||||
|
GroupAttr: "member",
|
||||||
|
},
|
||||||
|
Timeout: TimeoutConfig{
|
||||||
|
Success: 24 * time.Hour,
|
||||||
|
Wrong: 5 * time.Minute,
|
||||||
|
},
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
@ -19,7 +35,7 @@ func main() {
|
||||||
|
|
||||||
data, err := ioutil.ReadFile(*configFile)
|
data, err := ioutil.ReadFile(*configFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Could not read file \"%s\": %v\n", *configFile, err)
|
log.Fatalf("Error on read file \"%s\": %v\n", *configFile, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = yaml.Unmarshal(data, &config)
|
err = yaml.Unmarshal(data, &config)
|
||||||
|
@ -27,5 +43,21 @@ func main() {
|
||||||
log.Fatalf("Error on parse config: %v\n", err)
|
log.Fatalf("Error on parse config: %v\n", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Printf("Config: %+v\n", config)
|
fmt.Printf("Loaded config: %+v\n", config)
|
||||||
|
|
||||||
|
err = setupLDAP()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Error on connect to LDAP: %v\n", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
http.HandleFunc(config.Path, handler)
|
||||||
|
|
||||||
|
err = http.ListenAndServe(config.Web, nil)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Error on start server: %v\n", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func handler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
//w.WriteHeader(http.StatusOK)
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue