安全
来源:JHipster |
时间:2018-11-04
|
|

保护您的应用程序

要将Spring Security与单个Web页面应用程序一起使用,就像JHipster生成的那样,您需要Ajax登录/注销/错误视图。我们已经配置了Spring Security以正确使用这些视图,当然我们会为您生成所有JavaScript和HTML代码。

默认情况下,JHipster有4个不同的用户:

  • “系统”,主要由我们的审计日志使用,当事情自动完成时

  • “anonymousUser”,在他们执行操作时被授予匿名用户

  • “user”,是具有“ROLE_USER”授权的普通用户。他的默认密码是“用户”

  • “admin”,是具有“ROLE_USER”和“ROLE_ADMIN”授权的管理员用户。他的默认密码是“admin”

出于安全原因,您应该在生产中更改这些默认密码。

JHipster提供了4种主要的安全机制:

  1. JSON Web令牌(JWT)

  2. 基于会话的身份验证

  3. OAuth2和OpenID Connect

  4. JHipster用户帐户和身份验证(UAA)(由于此更复杂,因此具有单独的文档页面)

JSON Web令牌(JWT)

JSON Web Token(JWT)身份验证是一种无状态安全机制,因此如果您想在多个不同的服务器上扩展应用程序,它是一个不错的选择。

请注意,这是使用微服务架构时的默认选项

使用Spring Security时,此身份验证机制不存在,它是Java JWT项目的特定于JHipster的集成

此解决方案使用保存用户登录名和权限的安全令牌。由于令牌已签名,因此用户无法更改。

保护JWT

  • JHipster使用一个密钥,可以使用两个Spring Boot属性进行配置:jhipster.security.authentication.jwt.secretjhipster.security.authentication.jwt.base64-secret第二个选项使用Base64编码的字符串,因此它被认为更安全,因此建议使用。如果同时配置了这两个属性,secret则会出于遗留原因使用属性(安全性较低)。如果您不使用Base64属性,将在应用程序启动时显示警告。

  • 这些密钥的最小长度应为512位:如果它们不够长,您将无法使用它们登录。如果发生这种情况,控制台会有一个明确的警告来解释这个问题。

  • 密钥在application-*.yml文件中配置由于这些密钥必须保密,因此您应该以安全的方式存储它们以用于生产配置文件。它可以使用通常的Spring Boot属性配置进行设置:使用Spring Cloud Config服务器(如JHipster Registry(我们推荐的选项)),使用环境变量,甚至application-prod.yml使用系统管理员SCP 的特定文件。 directory作为应用程序的可执行WAR文件。

  • 应该更改默认的“用户”和“管理员”密码。最简单的方法是部署您的应用程序,以“用户/用户”登录,然后以“admin / admin”登录,并为每个应用程序使用“帐户>密码”菜单更改密码。

基于会话的身份验证

这是“经典”的Spring Security身份验证机制,但我们对其进行了相当大的改进。它使用HTTP会话,因此它是一种有状态机制:如果您计划在多个服务器上扩展应用程序,则需要使用具有粘性会话的负载均衡器,以便每个用户都驻留在同一服务器上。

保护基于会话的身份验证

  • 对于记住我的身份验证,记住我的密钥在application-dev.ymlapplication-prod.yml文件中配置jhipster.security.remember-me.key属性。由于此密钥必须保密,因此您应该以安全的方式存储它以用于生产配置文件。它可以使用通常的Spring Boot属性配置进行设置:使用Spring Cloud Config服务器(如JHipster Registry(我们推荐的选项)),使用环境变量,甚至application-prod.yml使用系统管理员SCP 的特定文件。 directory作为应用程序的可执行WAR文件。

  • 应该更改默认的“用户”和“管理员”密码。最简单的方法是部署您的应用程序,以“用户/用户”登录,然后以“admin / admin”登录,并为每个应用程序使用“帐户>密码”菜单更改密码。

改进了记忆机制

我们修改了Spring Security remember-me机制,以便您拥有一个存储在数据库中的唯一令牌(SQL或NoSQL数据库,具体取决于您在生成期间的选择!)。我们还存储了比标准实现更多的信息,因此您可以更好地了解这些令牌的来源:IP地址,浏览器,日期...我们生成一个完整的管理屏幕,以便您可以使会话无效,例如,如果您忘记了注销另一台计算机。

我们添加了一个非常完整的cookie防盗保护机制:我们将您的安全信息存储在cookie中以及数据库中,每次用户登录时,我们都会修改这些值并检查它们是否已被更改。这样,如果用户窃取了你的cookie,他最多只能使用一次。

CSRF保护

Spring Security和Angular都具有开箱即用的CSRF保护功能,但不幸的是它们不使用相同的cookie或HTTP标头!实际上,您实际上对CSRF攻击没有任何保护。当然,我们重新配置这两个工具,以便它们正确地协同工作。

OAuth2和OpenID Connect

OAuth是一种有状态的安全机制,如HTTP Session。Spring Security提供OAuth 2.0支持,JHipster利用它的@EnableOAuth2Sso注释。如果您不确定OAuth和OpenID Connect(OIDC)是什么,请参阅什么是OAuth?

Keycloak

Keycloak是使用JHipster配置的默认OpenID Connect服务器。

要登录您的应用程序,您需要启动并运行KeycloakJHipster团队为您创建了一个具有默认用户和角色的Docker容器。使用以下命令启动Keycloak。

docker-compose -f src/main/docker/keycloak.yml up

如果您想将Keycloak与Docker Compose一起使用,请务必阅读我们的Docker Compose文档,并正确配置您/etc/hosts的Keycloak。

src/main/resources/application.yml为此映像配置了安全设置

security:
    basic:
        enabled: false
    oauth2:
        client:
            access-token-uri: http://localhost:9080/auth/realms/jhipster/protocol/openid-connect/token
            user-authorization-uri: http://localhost:9080/auth/realms/jhipster/protocol/openid-connect/auth
            client-id: web_app
            client-secret: web_app
            scope: openid profile email
        resource:
            user-info-uri: http://localhost:9080/auth/realms/jhipster/protocol/openid-connect/userinfo

默认情况下,Keycloak使用嵌入式H2数据库,如果重新启动Docker容器,将丢失创建的用户。要保存您的数据,请阅读Keycloak Docker文档保留H2数据库的一个解决方案是执行以下操作:

  • 添加将保留的卷: ./keycloak-db:/opt/jboss/keycloak/standalone/data

  • 将迁移策略从OVERWRITE_EXISTING更改IGNORE_EXISTING(在命令部分中)

在生产中,Keycloak要求您使用HTTPS。有几种方法可以实现此目的,包括使用可以管理HTTPS的反向代理或负载均衡器。我们建议您阅读Keycloak HTTPS文档以了解有关此主题的更多信息。

1563

如果您想使用Okta而不是Keycloak,则需要更改一些内容。首先,您需要在https://developer.okta.com/signup/上创建一个免费的开发者帐户完成后,您将获得自己的Okta域名,其名称类似于https://dev-123456.oktapreview.com

修改src/main/resources/application.yml以使用您的Okta设置。提示:替换{yourOktaDomain}为您的组织名称(例如dev-123456.oktapreview)。

security:
    basic:
        enabled: false
    oauth2:
        client:
            access-token-uri: https://{yourOktaDomain}.com/oauth2/default/v1/token
            user-authorization-uri: https://{yourOktaDomain}.com/oauth2/default/v1/authorize
            client-id: {client-id}
            client-secret: {client-secret}
            scope: openid profile email
        resource:
            user-info-uri: https://{yourOktaDomain}.com/oauth2/default/v1/userinfo

在Okta创建一个OIDC应用程序来获取{client-id}{client-secret}要执行此操作,请登录Okta Developer帐户并导航到“ 应用程序” >“ 添加应用程序”单击Web,然后单击“ 下一步”按钮。为应用程序指定一个您将记住的名称,并指定http://localhost:8080为基本URI和http://localhost:8080/login登录重定向URI。单击“完成”并将客户端ID和机密复制到您的application.yml文件中。

创建一个ROLE_ADMINROLE_USER组(用户 >  > 添加组)并向其添加用户。您可以使用您注册的帐户,也可以创建新用户(“ 用户” >“ 添加人员”)。导航到API > 授权服务器,单击“ 授权服务器”选项卡并编辑默认选项卡。单击声明选项卡和添加声明将其命名为“groups”或“roles”,并将其包含在ID Token中。将值类型设置为“Groups”并将过滤器设置为Regex of .*

注意:如果您想一直使用Okta(而不是Keycloak),请修改JHipster的Protractor测试以在运行时使用此帐户。在更改凭证做到这一点src/test/javascript/e2e/account/account.spec.tssrc/test/javascript/e2e/admin/administration.spec.ts

做出这些改变后,你应该好好去!如果您有任何问题,请将它们发布到Stack Overflow请务必使用“jhipster”和“okta”标记您的问题。

您还可以使用环境变量来覆盖默认值。例如:

export SECURITY_OAUTH2_CLIENT_ACCESS_TOKEN_URI="https://{yourOktaDomain}.com/oauth2/default/v1/token"export SECURITY_OAUTH2_CLIENT_USER_AUTHORIZATION_URI="https://{yourOktaDomain}.com/oauth2/default/v1/authorize"export SECURITY_OAUTH2_RESOURCE_USER_INFO_URI="https://{yourOktaDomain}.com/oauth2/default/v1/userinfo"export SECURITY_OAUTH2_CLIENT_CLIENT_ID="{client-id}"export SECURITY_OAUTH2_CLIENT_CLIENT_SECRET="{client-secret}"

您可以将其放在一个~/.okta.env文件中并运行source ~/.okta.env以使用Okta覆盖Keycloak。

您可以在部署到Heroku时使用然后设置这些属性:

heroku config:set /
  SECURITY_OAUTH2_CLIENT_ACCESS_TOKEN_URI="$SECURITY_OAUTH2_CLIENT_ACCESS_TOKEN_URI" /
  SECURITY_OAUTH2_CLIENT_USER_AUTHORIZATION_URI="$SECURITY_OAUTH2_CLIENT_USER_AUTHORIZATION_URI" /
  SECURITY_OAUTH2_RESOURCE_USER_INFO_URI="$SECURITY_OAUTH2_RESOURCE_USER_INFO_URI" /
  SECURITY_OAUTH2_CLIENT_CLIENT_ID="$SECURITY_OAUTH2_CLIENT_CLIENT_ID" /
  SECURITY_OAUTH2_CLIENT_CLIENT_SECRET="$SECURITY_OAUTH2_CLIENT_CLIENT_SECRET"

对于Cloud Foundry,您可以使用以下内容,即$appName应用程序的名称。

cf set-env $appName SECURITY_OAUTH2_CLIENT_ACCESS_TOKEN_URI "$SECURITY_OAUTH2_CLIENT_ACCESS_TOKEN_URI"cf set-env $appName SECURITY_OAUTH2_CLIENT_USER_AUTHORIZATION_URI "$SECURITY_OAUTH2_CLIENT_USER_AUTHORIZATION_URI"cf set-env $appName SECURITY_OAUTH2_RESOURCE_USER_INFO_URI "$SECURITY_OAUTH2_RESOURCE_USER_INFO_URI"cf set-env $appName SECURITY_OAUTH2_CLIENT_CLIENT_ID "$SECURITY_OAUTH2_CLIENT_CLIENT_ID"cf set-env $appName SECURITY_OAUTH2_CLIENT_CLIENT_SECRET "$SECURITY_OAUTH2_CLIENT_CLIENT_SECRET"

请参阅使用OpenID Connect Support与JHipster一起使用Okta了解有关JHipster和OIDC的更多信息。

HTTPS

当您的应用程序在Heroku上运行时,您可以通过向您的应用程序添加以下配置来强制使用HTTPS SecurityConfiguration.java

@Configurationpublic class WebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.requiresChannel()
      .requestMatchers(r -> r.getHeader("X-Forwarded-Proto") != null)
      .requiresSecure();
  }}

这将适用于Heroku和Cloud Foundry。有关Heroku的更多生产技巧,请参阅在Heroku上准备用于生产的Spring Boot应用程序


提交
查看更多评论
没有更多评论