<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>oauth | 伪架构师</title>
    <link>/tags/oauth/</link>
      <atom:link href="/tags/oauth/index.xml" rel="self" type="application/rss+xml" />
    <description>oauth</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh</language><lastBuildDate>Mon, 09 Apr 2018 18:27:46 +0800</lastBuildDate>
    <image>
      <url>/img/logo-wide.png</url>
      <title>oauth</title>
      <link>/tags/oauth/</link>
    </image>
    
    <item>
      <title>Kubernetes 中用 Sidecar 为应用添加 Oauth 功能</title>
      <link>/post/sidecar-oauth-for-kubernetes-apps/</link>
      <pubDate>Mon, 09 Apr 2018 18:27:46 +0800</pubDate>
      <guid>/post/sidecar-oauth-for-kubernetes-apps/</guid>
      <description>

&lt;p&gt;Kubernetes 的 Pod 中可以同时运行共享网络栈的多个容器，使得 Sidecar 这种服务协作方式更加易于实施。这里我们就使用 Sidecar 方式，将 Keycloak 集成到 httpbin 服务上去，为没有认证的 httpbin 服务添加认证功能。&lt;/p&gt;

&lt;h2 id=&#34;概要&#34;&gt;概要&lt;/h2&gt;

&lt;p&gt;&lt;a href=&#34;https://www.keycloak.org/&#34; target=&#34;_blank&#34;&gt;Keycloak（链接 1）&lt;/a&gt; 是 JBoss 的一个认证服务软件，使用代理的方式，为其他应用提供认证能力，除了本文说到的 Oauth 之外，还提供二次认证、LDAP 等丰富的相关功能。&lt;/p&gt;

&lt;p&gt;在 Kubernetes 上部署 Keycloak 服务，对其进行初始化，建立用户和认证系统，然后将 Keycloak-Proxy 和 Httpbin 集成在同一个 Pod 中进行部署运行，测试集成效果。&lt;/p&gt;

&lt;p&gt;集成后的访问路径如图所示：
&lt;img src=&#34;images/keycloak-flow.jpg&#34; alt=&#34;Keycloak flow&#34; /&gt;&lt;/p&gt;

&lt;h2 id=&#34;keycloak-服务的初始化&#34;&gt;Keycloak 服务的初始化&lt;/h2&gt;

&lt;p&gt;Keycloak 支持多种数据库存储，这里为了方便，就直接使用内置的 H2 数据库了。这里选用的镜像是&lt;code&gt;jboss/keycloak:3.4.2.Final&lt;/code&gt;，开放服务端口 8080，并设置了三个环境变量：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;KEYCLOAK_USER&lt;/code&gt;：KeyCloak 初始管理员账号&lt;/li&gt;
&lt;li&gt;&lt;code&gt;KEYCLOAK_PASSWORD&lt;/code&gt;：KeyCloak 初始管理员密码&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PROXY_ADDRESS_FORWARDING&lt;/code&gt;：KeyCloak 部署在反向代理之后（Kubernetes 部署方式就在此列），就必须设置此变量为&lt;code&gt;true&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;接下来部署相关的 Service，如果有必要，还需要部署相关的 Ingress。&lt;/p&gt;

&lt;h2 id=&#34;设置-keycloak-服务器&#34;&gt;设置 Keycloak 服务器&lt;/h2&gt;

&lt;p&gt;启动 Keycloak Server 之后，我们访问&lt;code&gt;https://[keycloak service url]/auth/admin/&lt;/code&gt;，使用环境变量中设置的用户名密码登录，进行后续的安全设置，界面如图所示：&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;images/keycloak-main.png&#34; alt=&#34;Keycloak main&#34; /&gt;&lt;/p&gt;

&lt;h3 id=&#34;创建登录域&#34;&gt;创建登录域&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;鼠标在左上角的&lt;code&gt;Master&lt;/code&gt;字样上悬停，在弹出的菜单中选择&lt;code&gt;Add Realm&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;在左侧菜单&lt;code&gt;Configure&lt;/code&gt;下面，打开&lt;code&gt;Clients&lt;/code&gt;项，点击&lt;code&gt;Create&lt;/code&gt;设置&lt;code&gt;httpbin&lt;/code&gt;作为 Client ID 并保存。&lt;/li&gt;
&lt;li&gt;设置&lt;code&gt;Access Type&lt;/code&gt;为&lt;code&gt;confidential&lt;/code&gt;，&lt;code&gt;Valid Redirect URIs&lt;/code&gt;设置为&lt;code&gt;*&lt;/code&gt;，并保存。&lt;/li&gt;

&lt;li&gt;&lt;p&gt;打开&lt;code&gt;Installation&lt;/code&gt;标签，选择&lt;code&gt;Keycloak OIDC JSON&lt;/code&gt;，并拷贝显示出来的 JSON 代码，其中的部分内容可能不一致。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-json&#34;&gt;{
&amp;quot;realm&amp;quot;: &amp;quot;httpbin&amp;quot;,
&amp;quot;auth-server-url&amp;quot;: &amp;quot;https://[keycloak-server]/auth&amp;quot;,
&amp;quot;ssl-required&amp;quot;: &amp;quot;external&amp;quot;,
&amp;quot;resource&amp;quot;: &amp;quot;httpbin&amp;quot;,
&amp;quot;credentials&amp;quot;: {
  &amp;quot;secret&amp;quot;: &amp;quot;d97cfa70-8eb1-443a-8320-4cde9da34de6&amp;quot;
},
&amp;quot;confidential-port&amp;quot;: 0
}
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&#34;创建用户&#34;&gt;创建用户&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;在左侧的&lt;code&gt;Configure&lt;/code&gt;菜单上打开&lt;code&gt;Roles&lt;/code&gt;页面，点击&lt;code&gt;Add role&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;设置角色名称为&lt;code&gt;httpbin-role&lt;/code&gt;，保存。&lt;/li&gt;
&lt;li&gt;在左手的&lt;code&gt;Manage&lt;/code&gt;菜单中，打开&lt;code&gt;Users&lt;/code&gt;页面，点击&lt;code&gt;Add user&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;填写表单，设置&lt;code&gt;Email verified&lt;/code&gt;为&lt;code&gt;ON&lt;/code&gt;，保存内容。&lt;/li&gt;
&lt;li&gt;打开这一用户的&lt;code&gt;Role mappings&lt;/code&gt;标签，在&lt;code&gt;Available Roles&lt;/code&gt;列表中选择角色&lt;code&gt;httpbin-role&lt;/code&gt;，点击&lt;code&gt;Add selected&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;这样我们就完成了登录域的创建，并为后面将要启动的 httpbin 应用创建了相关的角色和用户。&lt;/p&gt;

&lt;h2 id=&#34;部署应用&#34;&gt;部署应用&lt;/h2&gt;

&lt;p&gt;根据前面的流程图，我们需要把 keycloak-proxy 组件用 sidecar 的方式和 httpbin 集成在一起，用反向代理的形式拦截请求，完成登录任务。&lt;/p&gt;

&lt;h3 id=&#34;创建-proxy-配置&#34;&gt;创建 proxy 配置&lt;/h3&gt;

&lt;p&gt;Proxy 配置文件内容可以参考&lt;a href=&#34;http://www.keycloak.org/docs/3.0/server_installation/topics/proxy.html&#34; target=&#34;_blank&#34;&gt;官方文档（链接 2）&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;keycloak-proxy 需要一个配置文件&lt;code&gt;/opt/jboss/conf&lt;/code&gt;，这里我们使用 configmap 的形式将其加载进来，配置文件的内容如下：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-json&#34;&gt;{
    &amp;quot;target-url&amp;quot;: &amp;quot;http://localhost:8000&amp;quot;,
    &amp;quot;send-access-token&amp;quot;: true,
    &amp;quot;bind-address&amp;quot;: &amp;quot;0.0.0.0&amp;quot;,
    &amp;quot;http-port&amp;quot;: &amp;quot;8080&amp;quot;,
    &amp;quot;applications&amp;quot;: [
        {
            &amp;quot;base-path&amp;quot;: &amp;quot;/&amp;quot;,
            &amp;quot;adapter-config&amp;quot;: {
                &amp;quot;realm&amp;quot;: &amp;quot;httpbin&amp;quot;,
                &amp;quot;auth-server-url&amp;quot;: &amp;quot;https://[keycloak-server]/auth&amp;quot;,
                &amp;quot;ssl-required&amp;quot;: &amp;quot;external&amp;quot;,
                &amp;quot;resource&amp;quot;: &amp;quot;httpbin&amp;quot;,
                &amp;quot;credentials&amp;quot;: {
                &amp;quot;secret&amp;quot;: &amp;quot;d97cfa70-8eb1-443a-8320-4cde9da34de6&amp;quot;
                }
            }
        ,
        &amp;quot;constraints&amp;quot;: [
                {
                    &amp;quot;pattern&amp;quot;: &amp;quot;/*&amp;quot;,
                    &amp;quot;roles-allowed&amp;quot;: [
                        &amp;quot;httpbin-role&amp;quot;
                    ]
                }
            ]
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这一配置要求 Proxy 代理本机 8000 端口（httpbin 的服务端口）的通信，并以 0.0.0.0:8080 对外提供服务，secret 字段内容来自于上面&lt;code&gt;Keycloak OIDC JSON&lt;/code&gt;的输出。&lt;/p&gt;

&lt;h3 id=&#34;创建-httpbin-deployment&#34;&gt;创建 httpbin deployment&lt;/h3&gt;

&lt;p&gt;在原有的应用部署的基础上，需要加入两个内容：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;加载 ConfigMap&lt;/li&gt;
&lt;li&gt;加入 Sidecar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;节选 yaml 代码：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;containers:
- image: citizenstig/httpbin
imagePullPolicy: IfNotPresent
name: httpd
ports:
- containerPort: 8000
    name: http-httpbin
- image: jboss/keycloak-proxy:3.4.2.Final
name: httpbin-proxy
volumeMounts:
- mountPath: /opt/jboss/conf
    name: config
ports:
- containerPort: 8080
    name: http-proxy
volumes:
- name: config
configMap:
    name: httpbin-proxy
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这里完成了上述的任务。&lt;/p&gt;

&lt;h3 id=&#34;创建服务&#34;&gt;创建服务&lt;/h3&gt;

&lt;p&gt;上面创建的 Deployment 之中有了两个端口，8080 是 keycloak 端口；8000 是 httpbin 端口，为了达到认证目的，服务应该指向 keycloak proxy 所在的 8080 端口。&lt;/p&gt;

&lt;h2 id=&#34;测试&#34;&gt;测试&lt;/h2&gt;

&lt;p&gt;依次完成业务应用部署之后，就可以进行测试了。&lt;/p&gt;

&lt;p&gt;在浏览器打开 httpbin 服务，会看到对这一服务的访问会被转向 Keycloak 的登录页面。如果输入的是管理员的账号密码，是无法成功访问服务的；而输入我们新建账号的登录凭据，则可以顺利返回。&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://gist.github.com/fleeto/e4d2996b3c0dba41831504747974cf0a&#34; target=&#34;_blank&#34;&gt;所有 yaml 代码（链接 3）&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&#34;链接&#34;&gt;链接&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;https://www.keycloak.org/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;http://www.keycloak.org/docs/3.0/server_installation/topics/proxy.html&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;https://gist.github.com/fleeto/e4d2996b3c0dba41831504747974cf0a&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>利用 Gitlab 为 Sonarqube 提供单点登录服务</title>
      <link>/post/oauth-for-sonarqube/</link>
      <pubDate>Sun, 29 Jan 2017 05:31:41 +0800</pubDate>
      <guid>/post/oauth-for-sonarqube/</guid>
      <description>

&lt;p&gt;Gitlab 很贴心的提供了一个 &lt;strong&gt;Oauth 2&lt;/strong&gt; 功能，可以作为 CI/CD 工具链的认证中心来使用。&lt;/p&gt;

&lt;p&gt;Sonarqube 的官方插件只有一个 Github 的支持插件，因此这一功能需要借助第三方插件来完成。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://gitlab.talanlabs.com/gabriel-allaigre/sonar-auth-gitlab-plugin&#34; target=&#34;_blank&#34;&gt;项目地址&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://nexus.talanlabs.com/content/groups/public_release/com/synaptix/sonar-auth-gitlab-plugin/1.0.0/sonar-auth-gitlab-plugin-1.0.0.jar&#34; target=&#34;_blank&#34;&gt;下载地址&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;实验环境&#34;&gt;实验环境&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gitlab 地址&lt;/strong&gt;：&lt;code&gt;http://10.211.55.75:32021&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sonarqube 地址&lt;/strong&gt;：&lt;code&gt;https://10.211.55.75:32032/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;这里需要注意的是，要使用这一功能，Sonarqube 必须使用 https 协议提供服务。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&#34;gitlab-设置&#34;&gt;Gitlab 设置&lt;/h2&gt;

&lt;p&gt;访问 admin/applications/new，新建应用接入。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;images/gitlab.oauth_.app_.info_.png&#34; alt=&#34;new app&#34; /&gt;&lt;/p&gt;

&lt;p&gt;填写应用信息和地址之后提交，Gitlab 会显式 App ID 和 Token。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;images/gitlab.oauth_.login_.png&#34; alt=&#34;app info&#34; /&gt;&lt;/p&gt;

&lt;h2 id=&#34;sonarqube-设置&#34;&gt;Sonarqube 设置&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;http://10.211.55.75:32021/admin/applications&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;插件下载后，复制到 Sonarqube 的 plugins 目录中（一般在 &lt;code&gt;$SONARHOME/extensions/plugins&lt;/code&gt; 目录下），然后重启 Sonarqube。&lt;/p&gt;

&lt;p&gt;Sonarqube 重启之后，在 &lt;code&gt;updatecenter/installed&lt;/code&gt; 会看到新的 &lt;strong&gt;GitLab Auth&lt;/strong&gt; 插件，启用之后，可以进行后续设置。&lt;/p&gt;

&lt;p&gt;访问路径 &lt;code&gt;settings?category=gitlab&lt;/code&gt;，会看到 Gitlab 认证的设置。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;images/sonarqube.gitlab.oauth_.png&#34; alt=&#34;Git lab settings&#34; /&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;这里建议打开允许注册的选项，如果一个用户账号在 Gitlab 中存在，却不存在于 Sonarqube 中，打开这一功能就可以自动进行账号的传播。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&#34;测试&#34;&gt;测试&lt;/h2&gt;

&lt;p&gt;新的登录界面如图所示：&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;images/gitlab.oauth_.new_.application.png&#34; alt=&#34;login&#34; /&gt;&lt;/p&gt;

&lt;p&gt;点击 Gitlab 图标会进入 Gitlab 认证界面，跟其他 Oauth 情况类似，就无需继续介绍了。&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
