mirror of
https://github.com/pomerium/pomerium.git
synced 2025-06-03 03:12:50 +02:00
config: fix databroker policies (#1821)
This commit is contained in:
parent
bcc8c17855
commit
84e8f6cc05
11 changed files with 42 additions and 20 deletions
|
@ -69,7 +69,7 @@ func validateOptions(o *config.Options) error {
|
||||||
// newPolicyEvaluator returns an policy evaluator.
|
// newPolicyEvaluator returns an policy evaluator.
|
||||||
func newPolicyEvaluator(opts *config.Options, store *evaluator.Store) (*evaluator.Evaluator, error) {
|
func newPolicyEvaluator(opts *config.Options, store *evaluator.Store) (*evaluator.Evaluator, error) {
|
||||||
metrics.AddPolicyCountCallback("pomerium-authorize", func() int64 {
|
metrics.AddPolicyCountCallback("pomerium-authorize", func() int64 {
|
||||||
return int64(len(opts.Policies))
|
return int64(len(opts.GetAllPolicies()))
|
||||||
})
|
})
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
_, span := trace.StartSpan(ctx, "authorize.newPolicyEvaluator")
|
_, span := trace.StartSpan(ctx, "authorize.newPolicyEvaluator")
|
||||||
|
|
|
@ -52,7 +52,7 @@ func New(options *config.Options, store *Store) (*Evaluator, error) {
|
||||||
e := &Evaluator{
|
e := &Evaluator{
|
||||||
custom: NewCustomEvaluator(store.opaStore),
|
custom: NewCustomEvaluator(store.opaStore),
|
||||||
authenticateHost: options.AuthenticateURL.Host,
|
authenticateHost: options.AuthenticateURL.Host,
|
||||||
policies: options.Policies,
|
policies: options.GetAllPolicies(),
|
||||||
}
|
}
|
||||||
if options.ClientCA != "" {
|
if options.ClientCA != "" {
|
||||||
e.clientCA = options.ClientCA
|
e.clientCA = options.ClientCA
|
||||||
|
@ -75,7 +75,7 @@ func New(options *config.Options, store *Store) (*Evaluator, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
store.UpdateAdmins(options.Administrators)
|
store.UpdateAdmins(options.Administrators)
|
||||||
store.UpdateRoutePolicies(options.Policies)
|
store.UpdateRoutePolicies(options.GetAllPolicies())
|
||||||
|
|
||||||
e.rego = rego.New(
|
e.rego = rego.New(
|
||||||
rego.Store(store.opaStore),
|
rego.Store(store.opaStore),
|
||||||
|
|
|
@ -245,7 +245,7 @@ func (a *Authorize) getEvaluatorRequestFromCheckRequest(in *envoy_service_auth_v
|
||||||
func (a *Authorize) getMatchingPolicy(requestURL *url.URL) *config.Policy {
|
func (a *Authorize) getMatchingPolicy(requestURL *url.URL) *config.Policy {
|
||||||
options := a.currentOptions.Load()
|
options := a.currentOptions.Load()
|
||||||
|
|
||||||
for _, p := range options.Policies {
|
for _, p := range options.GetAllPolicies() {
|
||||||
if p.Matches(requestURL) {
|
if p.Matches(requestURL) {
|
||||||
return &p
|
return &p
|
||||||
}
|
}
|
||||||
|
|
|
@ -112,6 +112,9 @@ type Options struct {
|
||||||
PolicyEnv string `yaml:",omitempty"`
|
PolicyEnv string `yaml:",omitempty"`
|
||||||
PolicyFile string `mapstructure:"policy_file" yaml:"policy_file,omitempty"`
|
PolicyFile string `mapstructure:"policy_file" yaml:"policy_file,omitempty"`
|
||||||
|
|
||||||
|
// AdditionalPolicies are any additional policies added to the options.
|
||||||
|
AdditionalPolicies []Policy `yaml:"-"`
|
||||||
|
|
||||||
// AuthenticateURL represents the externally accessible http endpoints
|
// AuthenticateURL represents the externally accessible http endpoints
|
||||||
// used for authentication requests and callbacks
|
// used for authentication requests and callbacks
|
||||||
AuthenticateURLString string `mapstructure:"authenticate_service_url" yaml:"authenticate_service_url,omitempty"`
|
AuthenticateURLString string `mapstructure:"authenticate_service_url" yaml:"authenticate_service_url,omitempty"`
|
||||||
|
@ -336,7 +339,7 @@ func newOptionsFromConfig(configFile string) (*Options, error) {
|
||||||
}
|
}
|
||||||
serviceName := telemetry.ServiceName(o.Services)
|
serviceName := telemetry.ServiceName(o.Services)
|
||||||
metrics.AddPolicyCountCallback(serviceName, func() int64 {
|
metrics.AddPolicyCountCallback(serviceName, func() int64 {
|
||||||
return int64(len(o.Policies))
|
return int64(len(o.GetAllPolicies()))
|
||||||
})
|
})
|
||||||
|
|
||||||
metrics.SetConfigChecksum(serviceName, o.Checksum())
|
metrics.SetConfigChecksum(serviceName, o.Checksum())
|
||||||
|
@ -404,6 +407,12 @@ func (o *Options) parsePolicy() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for i := range o.AdditionalPolicies {
|
||||||
|
p := &o.AdditionalPolicies[i]
|
||||||
|
if err := p.Validate(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -654,7 +663,7 @@ func (o *Options) Validate() error {
|
||||||
// assert group membership (except for azure which can be derived from the client
|
// assert group membership (except for azure which can be derived from the client
|
||||||
// id, secret and provider url)
|
// id, secret and provider url)
|
||||||
if o.ServiceAccount == "" && o.Provider != "azure" {
|
if o.ServiceAccount == "" && o.Provider != "azure" {
|
||||||
for _, p := range o.Policies {
|
for _, p := range o.GetAllPolicies() {
|
||||||
if len(p.AllowedGroups) != 0 {
|
if len(p.AllowedGroups) != 0 {
|
||||||
return fmt.Errorf("config: `allowed_groups` requires `idp_service_account`")
|
return fmt.Errorf("config: `allowed_groups` requires `idp_service_account`")
|
||||||
}
|
}
|
||||||
|
@ -751,6 +760,17 @@ func (o *Options) GetOauthOptions() oauth.Options {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetAllPolicies gets all the policies in the options.
|
||||||
|
func (o *Options) GetAllPolicies() []Policy {
|
||||||
|
if o == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
policies := make([]Policy, 0, len(o.Policies)+len(o.AdditionalPolicies))
|
||||||
|
policies = append(policies, o.Policies...)
|
||||||
|
policies = append(policies, o.AdditionalPolicies...)
|
||||||
|
return policies
|
||||||
|
}
|
||||||
|
|
||||||
// Checksum returns the checksum of the current options struct
|
// Checksum returns the checksum of the current options struct
|
||||||
func (o *Options) Checksum() uint64 {
|
func (o *Options) Checksum() uint64 {
|
||||||
return hashutil.MustHash(o)
|
return hashutil.MustHash(o)
|
||||||
|
|
|
@ -283,12 +283,14 @@ func (mgr *Manager) GetConfig() *config.Config {
|
||||||
}
|
}
|
||||||
|
|
||||||
func sourceHostnames(cfg *config.Config) []string {
|
func sourceHostnames(cfg *config.Config) []string {
|
||||||
if len(cfg.Options.Policies) == 0 {
|
policies := cfg.Options.GetAllPolicies()
|
||||||
|
|
||||||
|
if len(policies) == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
dedupe := map[string]struct{}{}
|
dedupe := map[string]struct{}{}
|
||||||
for _, p := range cfg.Options.Policies {
|
for _, p := range policies {
|
||||||
dedupe[p.Source.Hostname()] = struct{}{}
|
dedupe[p.Source.Hostname()] = struct{}{}
|
||||||
}
|
}
|
||||||
if cfg.Options.AuthenticateURL != nil {
|
if cfg.Options.AuthenticateURL != nil {
|
||||||
|
|
|
@ -75,8 +75,8 @@ func (srv *Server) buildClusters(options *config.Options) ([]*envoy_config_clust
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.IsProxy(options.Services) {
|
if config.IsProxy(options.Services) {
|
||||||
for i := range options.Policies {
|
for i, p := range options.GetAllPolicies() {
|
||||||
policy := options.Policies[i]
|
policy := p
|
||||||
if policy.EnvoyOpts == nil {
|
if policy.EnvoyOpts == nil {
|
||||||
policy.EnvoyOpts = newDefaultEnvoyClusterConfig()
|
policy.EnvoyOpts = newDefaultEnvoyClusterConfig()
|
||||||
}
|
}
|
||||||
|
|
|
@ -439,7 +439,7 @@ func getAllRouteableDomains(options *config.Options, addr string) []string {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if config.IsProxy(options.Services) && addr == options.Addr {
|
if config.IsProxy(options.Services) && addr == options.Addr {
|
||||||
for _, policy := range options.Policies {
|
for _, policy := range options.GetAllPolicies() {
|
||||||
for _, h := range urlutil.GetDomainsForURL(policy.Source.URL) {
|
for _, h := range urlutil.GetDomainsForURL(policy.Source.URL) {
|
||||||
lookup[h] = struct{}{}
|
lookup[h] = struct{}{}
|
||||||
}
|
}
|
||||||
|
|
|
@ -181,8 +181,8 @@ func buildPolicyRoutes(options *config.Options, domain string) []*envoy_config_r
|
||||||
var routes []*envoy_config_route_v3.Route
|
var routes []*envoy_config_route_v3.Route
|
||||||
responseHeadersToAdd := toEnvoyHeaders(options.Headers)
|
responseHeadersToAdd := toEnvoyHeaders(options.Headers)
|
||||||
|
|
||||||
for i := range options.Policies {
|
for i, p := range options.GetAllPolicies() {
|
||||||
policy := options.Policies[i]
|
policy := p
|
||||||
if !hostMatchesDomain(policy.Source.URL, domain) {
|
if !hostMatchesDomain(policy.Source.URL, domain) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -445,7 +445,7 @@ func setHostRewriteOptions(policy *config.Policy, action *envoy_config_route_v3.
|
||||||
}
|
}
|
||||||
|
|
||||||
func hasPublicPolicyMatchingURL(options *config.Options, requestURL *url.URL) bool {
|
func hasPublicPolicyMatchingURL(options *config.Options, requestURL *url.URL) bool {
|
||||||
for _, policy := range options.Policies {
|
for _, policy := range options.GetAllPolicies() {
|
||||||
if policy.AllowPublicUnauthenticatedAccess && policy.Matches(requestURL) {
|
if policy.AllowPublicUnauthenticatedAccess && policy.Matches(requestURL) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,7 +82,7 @@ func (src *ConfigSource) rebuild(firstTime bool) {
|
||||||
src.runUpdater(cfg)
|
src.runUpdater(cfg)
|
||||||
|
|
||||||
seen := map[uint64]struct{}{}
|
seen := map[uint64]struct{}{}
|
||||||
for _, policy := range cfg.Options.Policies {
|
for _, policy := range cfg.Options.GetAllPolicies() {
|
||||||
seen[policy.RouteID()] = struct{}{}
|
seen[policy.RouteID()] = struct{}{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -128,7 +128,7 @@ func (src *ConfigSource) rebuild(firstTime bool) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// add the additional policies here since calling `Validate` will reset them.
|
// add the additional policies here since calling `Validate` will reset them.
|
||||||
cfg.Options.Policies = append(cfg.Options.Policies, additionalPolicies...)
|
cfg.Options.AdditionalPolicies = append(cfg.Options.AdditionalPolicies, additionalPolicies...)
|
||||||
|
|
||||||
src.computedConfig = cfg
|
src.computedConfig = cfg
|
||||||
if !firstTime {
|
if !firstTime {
|
||||||
|
|
|
@ -65,7 +65,7 @@ func TestConfigSource(t *testing.T) {
|
||||||
assert.NoError(t, ctx.Err())
|
assert.NoError(t, ctx.Err())
|
||||||
return
|
return
|
||||||
case cfg := <-cfgs:
|
case cfg := <-cfgs:
|
||||||
assert.Len(t, cfg.Options.Policies, 0)
|
assert.Len(t, cfg.Options.AdditionalPolicies, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
select {
|
select {
|
||||||
|
@ -73,7 +73,7 @@ func TestConfigSource(t *testing.T) {
|
||||||
assert.NoError(t, ctx.Err())
|
assert.NoError(t, ctx.Err())
|
||||||
return
|
return
|
||||||
case cfg := <-cfgs:
|
case cfg := <-cfgs:
|
||||||
assert.Len(t, cfg.Options.Policies, 1)
|
assert.Len(t, cfg.Options.AdditionalPolicies, 1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -71,7 +71,7 @@ func New(cfg *config.Config) (*Proxy, error) {
|
||||||
p.currentRouter.Store(httputil.NewRouter())
|
p.currentRouter.Store(httputil.NewRouter())
|
||||||
|
|
||||||
metrics.AddPolicyCountCallback("pomerium-proxy", func() int64 {
|
metrics.AddPolicyCountCallback("pomerium-proxy", func() int64 {
|
||||||
return int64(len(p.currentOptions.Load().Policies))
|
return int64(len(p.currentOptions.Load().GetAllPolicies()))
|
||||||
})
|
})
|
||||||
|
|
||||||
return p, nil
|
return p, nil
|
||||||
|
@ -94,7 +94,7 @@ func (p *Proxy) OnConfigChange(cfg *config.Config) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Proxy) setHandlers(opts *config.Options) {
|
func (p *Proxy) setHandlers(opts *config.Options) {
|
||||||
if len(opts.Policies) == 0 {
|
if len(opts.GetAllPolicies()) == 0 {
|
||||||
log.Warn().Msg("proxy: configuration has no policies")
|
log.Warn().Msg("proxy: configuration has no policies")
|
||||||
}
|
}
|
||||||
r := httputil.NewRouter()
|
r := httputil.NewRouter()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue