- 投稿日:2019-06-07T23:37:06+09:00
一足遅れて Kubernetes を学び始める - 15. セキュリティ -
ストーリー
- 一足遅れて Kubernetes を学び始める - 01. 環境選択編 -
- 一足遅れて Kubernetes を学び始める - 02. Docker For Mac -
- 一足遅れて Kubernetes を学び始める - 03. Raspberry Pi -
- 一足遅れて Kubernetes を学び始める - 04. kubectl -
- 一足遅れて Kubernetes を学び始める - 05. workloads その1 -
- 一足遅れて Kubernetes を学び始める - 06. workloads その2 -
- 一足遅れて Kubernetes を学び始める - 07. workloads その3 -
- 一足遅れて Kubernetes を学び始める - 08. discovery&LB その1 -
- 一足遅れて Kubernetes を学び始める - 09. discovery&LB その2 -
- 一足遅れて Kubernetes を学び始める - 10. config&storage その1 -
- 一足遅れて Kubernetes を学び始める - 11. config&storage その2 -
- 一足遅れて Kubernetes を学び始める - 12. リソース制限 -
- 一足遅れて Kubernetes を学び始める - 13. ヘルスチェックとコンテナライフサイクル -
- 一足遅れて Kubernetes を学び始める - 14. スケジューリング -
- 一足遅れて Kubernetes を学び始める - 15. セキュリティ -
前回
一足遅れて Kubernetes を学び始める - 14. スケジューリング -では、AffinityなどでPodのスケジューリングについて学習しました。今回は、セキュリティについて学習します。
サービスアカウント
Podで実行するためのプロセスを制御するために割り振られるアカウントのことをサービスアカウントというそうです。
sample-serviceaccount.yamlapiVersion: v1 kind: ServiceAccount metadata: name: sample-serviceaccount namespace: default imagePullSecrets: - name: hogehogeこれをapplyしてみます。
pi@raspi001:~/tmp $ k apply -f sample-serviceaccount.yaml pi@raspi001:~/tmp $ k get serviceaccounts sample-serviceaccount -o yaml ... secrets: - name: sample-serviceaccount-token-4xhgmサービスアカウントが作成されました。また、imagePullSecretsの内容がsecretsに登録されました。(sample-serviceaccount-token-4xhgm)
imagePullSecretsはprivateなdockerレジストリに使います。pi@raspi001:~/tmp $ k get secrets sample-serviceaccount-token-4xhgm -o yaml apiVersion: v1 data: ca.crt: ... namespace: ZGVmYXVsdA== token: ... kind: Secret metadata: annotations: kubernetes.io/service-account.name: sample-serviceaccount kubernetes.io/service-account.uid: 4bd076da-8854-11e9-af26-b827eb8ccd80 creationTimestamp: "2019-06-06T12:12:04Z" name: sample-serviceaccount-token-4xhgm namespace: default resourceVersion: "584634" selfLink: /api/v1/namespaces/default/secrets/sample-serviceaccount-token-4xhgm uid: 4bfbe8bb-8854-11e9-af26-b827eb8ccd80 type: kubernetes.io/service-account-token認証に必要なtokenが登録されていますね。
RBAC (Role Based Access Control)
RBACは、さきほど作成したサービスアカウントと、どういった操作を許可するのかを定めたRoleを紐付け(RoleBinding)して、権限管理をします。1つのRoleに対して複数のサービスアカウントをRoleBindingできます。
RBACは、2つのレベルがあり、1つはNamespaceレベルで、もう一つはクラスタレベルがあります。
設定範囲がクラスタの方が大きい感じです。(namespace横断して設定する場合はクラスタレベルにする)
- RoleとClusterRole
- RoleBindingとClusterRoleBinding
操作の種類ですが、どのDeploymentやDaemonSetのようなリソースに対して下記のものがあります。
* 全ての処理 create 作成 delete 削除 get 取得 list 一覧取得 update 更新 patch 一部変更 watch 変更の追従 今回はKubernetes道場 20日目 - Role / RoleBinding / ClusterRole / ClusterRoleBindingについてを参考に進めます。
新しく作ったサービスアカウントでコンテキストを作成し、そのアカウントからPod情報を取得できるか試してみます。
そのためには、サービスアカウントの認証情報を通しておく必要があります。
※ RoleとClusterRoleに大きな違いはないため、Roleを試します。pi@raspi001:~/tmp $ TOKEN=$(k get secret/sample-serviceaccount-token-jd279 -o json | jq -r .data.token) pi@raspi001:~/tmp $ DECODE_TOKEN=$(echo -n $TOKEN | base64 -d) pi@raspi001:~/tmp $ k config set-credentials sample-serviceaccount --token $DECODE_TOKENでは、コンテキスト(sample-sa-context)を作成して、それを使用します。
pi@raspi001:~/tmp $ k config set-context sample-sa-context --user sample-serviceaccount --cluster kubernetes pi@raspi001:~/tmp $ k config use-context sample-sa-context pi@raspi001:~/tmp $ k config get-contexts CURRENT NAME CLUSTER AUTHINFO NAMESPACE kubernetes-admin@kubernetes kubernetes kubernetes-admin * sample-sa-context kubernetes sample-serviceaccount新たに作成したサービスアカウントでPodの情報が取得できるか試してみます。
pi@raspi001:~/tmp $ k get po Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:default:sample-serviceaccount" cannot list resource "pods" in API group "" in the namespace "default"Errorになりました。sample-serviceaccountは何もRoleをバインドしていないからですね。
では、RoleBindingしていきます。元に戻ります。
pi@raspi001:~/tmp $ k config use-context kubernetes-admin@kubernetes
sample-role.yamlapiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: sample-role rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "watch", "list"]sample-rolebinding.yamlapiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: sample-rolebinding namespace: default roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: sample-role subjects: - kind: ServiceAccount name: sample-serviceaccount namespace: defaultpi@raspi001:~/tmp $ k apply -f sample-role.yaml pi@raspi001:~/tmp $ k apply -f sample-rolebinding.yamlでは、もう一度試してみます。
pi@raspi001:~/tmp $ k config use-context sample-sa-context pi@raspi001:~/tmp $ k get po NAME READY STATUS RESTARTS AGE ...おお、取得できました!
もとに戻しておきます。pi@raspi001:~/tmp $ k config use-context kubernetes-admin@kubernetes
SecurityContext
コンテナに対してセキュリティ設定をすることができます。
例えば、Capabilitiesの追加・削除、実行するユーザ、グループの変更、ファイルのReadOnly化などができるそうです。sample-capabilities.yamlapiVersion: v1 kind: Pod metadata: name: sample-capabilities spec: containers: - name: nginx-container image: nginx:1.12 securityContext: capabilities: add: ["SYS_ADMIN"] drop: ["AUDIT_WRITE"]applyし、中身を確認してみます。
pi@raspi001:~/tmp $ k apply -f sample-capabilities.yaml pi@raspi001:~/tmp $ k exec -it sample-capabilities /bin/bash root@sample-capabilities:/# apt update && apt install libcap2-bin root@sample-capabilities:/# capsh --print | grep Current Current: = cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_sys_admin,cap_mknod,cap_setfcap+eip root@sample-capabilities:/# exitcap_sys_adminが増えてますね。audit_writeは見つかりません。
そもそも、どんな種類があるのか分からなかったので、こちらを参考にしました。PodSecurityContext
Pod(全てのコンテナ)に対してセキュリティ設定をすることができます。
例えば、実行するユーザやグループの制御、root実行を拒否したり、カーネルパラメータを上書きすることもできます。sample-runuser.yamlapiVersion: v1 kind: Pod metadata: name: sample-runuser spec: securityContext: runAsUser: 99 # runAsGroup: 99 supplementalGroups: - 1001 - 1002 containers: - name: centos-container image: centos:7 command: ["/bin/sleep", "3600"]では、applyしています。
pi@raspi001:~/tmp $ k apply -f sample-runuser.yaml pi@raspi001:~/tmp $ k exec -it sample-runuser -- id uid=99(nobody) gid=99(nobody) groups=99(nobody),1001,1002 pi@raspi001:~/tmp $ k exec -it sample-runuser -- ps aux | grep sleep nobody 1 0.0 0.0 2032 372 ? Ss 14:02 0:00 /bin/sleep 3600実行したユーザがnobody(99)に変更されていますね。また、supplementalGroupsで、プライマリGIDに指定のGIDを追加することができます。
そのほか
PodSecurityPolicyや、NetworkPolicy、そして認証、認可のAdmissionControlというものもあるそうです。
お片付け
pi@raspi001:~/tmp $ k delete -f sample-serviceaccount.yaml -f sample-role.yaml -f sample-rolebinding.yaml -f sample-capabilities.yaml -f sample-runuser.yaml pi@raspi001:~/tmp $ k config delete-context sample-sa-context最後に
主にRBACについて学習しました。
複数人で開発する際は、コンテキストを分けて開発を進めるのが良いみたいですね。
今回で取り組んだように、誰がどの権限を持っているかをRBACで管理できるので、
必要以上の権限を与えられて事故るようなことは少なくなりますね。
(といっても、まだ個人でしか使ってないので分かりませんが...)
- 投稿日:2019-06-07T15:56:15+09:00
MacにRedisをインストールする
- 投稿日:2019-06-07T14:42:38+09:00
[mac]ターミナル+bashでgit操作してるなら脳死でこれやっとけ
注意
これやったのmac使い始めて1ヶ月目くらいなので正直あんまり覚えてない
ミスってるとこあったらコメントで指摘もらえるとありがたいこの記事でできること
所要時間 5〜15分
・ターミナルの$前(プロンプト)にカレントディレクトリが表示される
・プロンプトに時間が表示される
・プロンプトにブランチ名が表示される
・プロンプトに色がつくプロンプトのデフォは↓
terminalshinozakirinka-no-MacBook-Air:lisbeth shinozakirika $ダセェ
構成 :
現在時刻(hh:mm:ss) カレントディレクトリ 果実 ( gitのbranch名 ) $
色も付いてて無駄な情報がない!カレントディレクトリを出力する
まずはカレントディレクトリのみを表示するように変更
viコマンドで.bashrcを編集
terminal$ vi ~/.bashrc
.bashrcexport PS1='\W $' # 追記
PS1
というのがプロンプトの内容みたいな感じ、\W
がカレントディレクトリを表す変数
sourceコマンドを流すと、設定反映terminalsource ~/.bashrcこれでプロンプトにカレントディレクトリが表示されたはず
タイムスタンプを出力する
terminal$ vi ~/.bashrc.bashrcexport PS1='\W $' # これを export PS1='\t \W $' # こう
\t
というのが時間(24時間形式)を表す変数
またsourceで設定反映terminalsource ~/.bashrcタイムスタンプが表示されたはず
現在のブランチ名を表示する
結論から書くと
.bashrcsource ~/project/git/contrib/completion/git-completion.bash source ~/project/git/contrib/completion/git-prompt.sh GIT_PS1_SHOWDIRTYSTATE=true GIT_PS1_SHOWUNTRACKEDFILES=true GIT_PS1_SHOWSTASHSTATE=true export PS1='\t \W$(__git_ps1) $ 'とするとブランチ名が表示される
source ~/project/git/contrib/completion/git-completion.bash
source ~/project/git/contrib/completion/git-prompt.shこの2つはブランチ名表示するのに必要なやつ
(理解はしてないけど、とりあえず理解する必要もない)
brewでgitをインストールしたならここにあるはず.bashrc$ ls /usr/local/etc/bash_completion.d/↑流して出ない人は↓から落として来て、そのpathを書けばいい
https://github.com/git/git/tree/master/contrib/completionGIT_PS1_SHOWDIRTYSTATE=true
GIT_PS1_SHOWUNTRACKEDFILES=true
GIT_PS1_SHOWSTASHSTATE=trueブランチ名の右側にステータスが表示される
変更されたファイルがあれば*
addされたファイルあれば+
追加されたファイルがあれば%
stashがあれば$
便利
[おまけ1]色を付ける
いい感じになったけど色つけると可愛くなる
.bashrcexport PS1='\[\033[33m\]\t \[\033[36m\]\W\[\033[35m\]$(__git_ps1)\[\033[00m\] \$ '本題とずれるので自分好みにしたい人は↓記事みてみるといい
https://qiita.com/fernet/items/4dcb6f82520d87227121[おまけ2]点滅する果実を表示する
僕は最終的に↓使ってる
.bashrcexport PS1='\[\033[33m\]\t \[\033[36m\]\W\[\033[5;31m\] \[\033[00m\]\[\033[35m\]$(__git_ps1)\[\033[00m\] \$ 'おわり
これでgit branchとかgit status打つ機会は圧倒的に減ったと思う
- 投稿日:2019-06-07T14:33:22+09:00
ブラウザのfaviconキャッシュを消す
faviconが消えない。
Webアプリを作ってて仕上げにアイコン画像を設定するも、ブラウザの方はたとえばVue.jsで作ったシステムだといつまでたっても緑のVアイコンが変わらないなんてことがよく起きますよね。(特に開発環境localhost:xxxxとか)
ブラウザのタブ部分とかに表示されてるfaviconは、強制リロードしてもキャッシュを削除してリロードしてもなかなか反映されないです。
そんな時、私はブラウザのfaviconキャッシュを消すようにしてます。
パスの備忘録も兼ねて...
Chrome
- よくわからないがjournalも削除してる。
rm -f ~/Library/Application\ Support/Google/Chrome/Default/Favicons rm -f ~/Library/Application\ Support/Google/Chrome/Default/Favicons-journalSafari
- ディレクトリごと削除。
rm -rf ~/Library/Safari/Favicon\ CacheFirefox
- プロファイルが個別なのがいやらしい、とにかく全部消す。
rm -f ~/Library/Application\ Support/Firefox/Profiles/*.default*/favicons.sqlite
あ、Macしかわかりません。
- 投稿日:2019-06-07T05:59:21+09:00
【ターミナル改造④】情報表示のlsコマンドの装飾ツールの「lsd」を導入して、外観からの効率性を問う。
- 白黒ターミナルを利用する生活が多くなってきた無機質生活に、少々彩りを加えるために奔走する記事第四弾。
- とうとうMacのデフォルトシェルがbashからzshへ変わることに、冷静を最大に装いながら、無意識の手の震えが止むことを知らない。
- 今回は、ファイルやフォルダの情報表示のlsコマンドを、カラフルにわかりやすく表示してくれる「lsd」を導入して、外観と効率性の両立を検討していくことにしよう。
概要
- Rust製の高速ファイル情報表示コマンドツール。
- 同様のlsコマンドに比べて、「明快な可視化・カラフル」であることが特徴。
- 公式GitHub
作業環境
- Mac OS X 10.13.4
- Homebrew 2.1.4
インストール
- 「ターミナル.app」を開き、下記のコマンドをうち、lsdの利用環境を構築する。
# brewでlsdをインストール $ brew install lsd # lsdのバージョン確認 $ lsd -V # デフォルトでは、アイコン未表示のため、フォントをインストールする。 $ brew tap homebrew/cask-fonts $ brew cask install font-hack-nerd-font
- フォントのインストール完了後、「ターミナル.app」の環境設定を開き、「プロファイル」欄を開く。
- ※環境設定ページは、ターミナル上で「cmd + ,」のショートカットで開くことができる。
- 「プロファイル」欄の「フォント」欄の変更ボタンをクリックして、フォント変更ページを出す。
- フォント変更ページの「ファミリー」欄に、先ほどインストールしたHackNerdFontに変更する。
- そのほかのインストール方法はこちらを参考にする。
結果
- 下記、実際の画面
- フォルダのツリー構造表示も可能。
基本操作
- ※基本的には、lsコマンドの操作と変わらない。
内容 コマンド 通常表示 lsd
縦表示 lsd -l
隠しファイル含め表示 lsd -a
ワンライン表示 lsd -1
ツリー構造での表示 lsd --tree
※オプションで階層制限は現在不可能なため、全ファイル表示されることに注意フォルダの中身含め全表示(再帰処理) lsd -R
逆順でのソート表示 lsd -lr
サイズごとのソート表示 lsd -lS
まとめ
- 今回はカラフルな情報表示ツールの試用ということで、作業効率思考を蚊帳の外に置き、色彩に浸りながら、記事を書く。
- これまでターミナル装飾ツールを色々利用してきたが、圧倒的割合の「外観ひけらかし設定」のため、効率性の本質を自問自答。
- 「外観も効率性向上に必須だ」と数える程度に自分に言い聞かせながら、次の装飾術を探すことにしよう。
参考
https://github.com/Peltoche/lsd
→公式GitHubです。大変お世話になりました。https://wonderwall.hatenablog.com/entry/2019/03/04/220000
→こちらの記事を参考にしました。大変お世話になりました。https://www.evoworx.co.jp/blog/homebrew-cask/
→Homebrew Caskのインストール方法の紹介として利用いたしました。大変お世話になりました。
- 投稿日:2019-06-07T00:26:52+09:00
Karabiner-Elementsの設定が超絶楽になるDSL「Goku」
※使用環境:
Goku 0.2.5
,Karabiner-Elements 12.4.0
,Homebrew 2.1.4
,macOS 10.13.6
はじめに
「Mac 三大神アプリ」の1つと言っても差し支えない「Karabiner-Elements」ですが、設定ファイルの編集が少し面倒ですよね。GokuというKarabiner-Elements用のDSLを使うと、めちゃくちゃ楽に設定ができるようになりますよ。
どのくらい楽になるのか?
「
左Optionキー
の空打ちを、Control+F2
に割り当てる1」という設定を例に、Gokuを使わずに直接書いた場合と、Gokuを使って書いた場合とを比べてみます。
- Gokuを使わない場合
karabiner.json(抜粋){ "description": "左Option(空打ち) -> Ctrl+F2", "manipulators": [ { "from": { "key_code": "left_option" }, "to": [ { "key_code": "left_option" } ], "to_if_alone": [ { "key_code": "f2", "modifiers": [ "left_control" ] } ], "type": "basic" } ] }
- Gokuを使った場合
karabiner.edn(抜粋){:des "左Option(空打ち) -> Ctrl+F2" :rules [[:left_option :left_option nil {:alone :!Tf2}]]}いかがでしょうか?
1つだけだと、違いがもう一つ伝わらないかもしれませんので、さらに設定を2つ追加してみます。
Terminalアプリの場合にのみ、「Cmd+S
->Ctrl+S
」「Cmd+T
->Cmd+T
,英数キー
」となる設定を追加した例が下記になります。
Gokuを使わない場合 (クリックで表示)
karabiner.json(抜粋){ "rules": [ { "description": "左Option(空打ち) -> Ctrl+F2", "manipulators": [ { "from": { "key_code": "left_option" }, "to": [ { "key_code": "left_option" } ], "to_if_alone": [ { "key_code": "f2", "modifiers": [ "left_control" ] } ], "type": "basic" } ] }, { "description": "[Terminal] Cmd+S -> Ctrl+S", "manipulators": [ { "conditions": [ { "bundle_identifiers": [ "^com\\.googlecode\\.iterm2$", "^com\\.apple\\.Terminal$" ], "type": "frontmost_application_if" } ], "from": { "key_code": "s", "modifiers": { "mandatory": [ "left_command" ] } }, "to": [ { "key_code": "s", "modifiers": [ "left_control" ] } ], "type": "basic" } ] }, { "description": "[Terminal] Cmd+T -> Cmd+T, EISUU", "manipulators": [ { "conditions": [ { "bundle_identifiers": [ "^com\\.googlecode\\.iterm2$", "^com\\.apple\\.Terminal$" ], "type": "frontmost_application_if" } ], "from": { "key_code": "t", "modifiers": { "mandatory": [ "left_command" ] } }, "to": [ { "key_code": "t", "modifiers": [ "left_command" ] }, { "key_code": "japanese_eisuu" } ], "type": "basic" } ] } ] }
- Gokuを使った場合
karabiner.edn{:main [{:des "左Option(空打ち) -> Ctrl+F2" :rules [[:left_option :left_option nil {:alone :!Tf2}]]} {:des "[Terminal] Cmd+S -> Ctrl+S" :rules [[:!Cs :!Ts :terminal]]} {:des "[Terminal] Cmd+T -> Cmd+T, EISUU" :rules [[:!Ct [:!Ct :japanese_eisuu] :terminal]]}] :applications {:terminal ["^com\\.googlecode\\.iterm2$" "^com\\.apple\\.Terminal$"]}}いかがでしょうか?
Gokuを使わない場合は70行以上の追加が必要ですが、Gokuを使った場合は3行の追加で済みます。
このように、Gokuを使えば大半の設定は1~2行で書けるため、追加や見直しを躊躇する必要がなく、いつでも思いついたタイミングで新しい設定を試してみることが可能になります。
導入手順
Gokuを試してみたい方は、まず最初に以下の3つのドキュメントを読むことをオススメします。インストール方法、記述方法、Karabiner-Elementsへの反映まで、必要なことが一通り網羅されています。
- README.md
- Tutorial
- Example1. Install
HomebrewでGithubのリポジトリをtapしてインストールします。
$ brew install yqrashawn/goku/goku2. Profileの作成
Karabiner-Elementsの設定画面の「Profiles」から、
Default
という名前のProfileを追加してください。
GokuはProfileを指定する記述がない場合、Default
という名前のProfileに設定を反映しようとします。[※注意事項]
もし、既にDefault
という名前でProfileを運用している場合、Gokuで記述されていないリマップルールは反映時に消えてしまいますので、リネームしておいてください。別の名前のProfileを使うように指定することも可能ですが、記述ミスなどによってDefault
という名前のProfileが使われることもありますので、慣れるまではリネームしておいたほうが安全です。3. karabiner.ednの作成
Gokuはデフォルトでは、
~/.config/karabiner.edn
を設定ファイルとして読み込みます。
他のディレクトリやファイル名を使う場合は、反映時に環境変数GOKU_EDN_CONFIG_FILE
を使ってファイルパスを指定しておく必要があります。はじめに紹介した「
左Optionキー
の空打ちを、Ctrl+F2
に割り当てる」という設定のみを書いたkarabiner.edn
を作成します。$ cd ~/.config $ echo `{:main [{:des "左Option(空打ち) -> Ctrl+F2" :rules [[:left_option :left_option nil {:alone :!Tf2}]]}]}` > karabiner.edn4. Karabiner-Elementsへの反映
goku
コマンドを実行して、karabiner.edn
に書いた設定を、Karabiner-Elementsへの反映します。$ goku
Done!
と表示されたら反映完了です。
Karabiner-ElementsからProfileをDefault
に変更すれば、設定が反映されていることが確認できます。デフォルトとは違うディレクトリやファイル名で設定ファイルを作成した場合は、以下のように
GOKU_EDN_CONFIG_FILE
という環境変数でパスを指定後、goku
コマンドを実行してください。$ GOKU_EDN_CONFIG_FILE=~/path/to/file.edn $ goku設定ファイルをウォッチする
gokuw
コマンドを実行すると、設定ファイルをウォッチして、変更があれば自動でgoku
コマンドが実行されるようになります。$ gokuw
また、
brew services start yqrashawn/goku/goku
を実行すると、gokuw
コマンドと同様の処理がバックグラウンドサービスとして起動されます。ただし、現状はいずれの場合もウォッチする設定ファイルのパスが固定で、環境変数は使われないようになっているため、デフォルト以外のファイルパスを使っている場合は、
gokuw
の中身を変更したり、別のスクリプトを書いて対応する必要があります。/usr/local/bin/gokuw#!/bin/sh watchexec -r -w ~/.config/karabiner.edn /usr/local/opt/goku/bin/gokuインポート用設定ファイルを使って反映する場合
goku
コマンドを実行すると、karabiner.json
が更新されますが、それを避けたい場合はインポート用の設定ファイルを作成するのがいいかと思います。方法は下記の記事を参照してください。
【Karabiner-Elements+Goku】インポート用の設定ファイルを作成する参考資料
Goku
karabiner.edn
edn
Macの標準設定では、
Control+F2
はメニューバーへフォーカスが移動するショートカットです。 ↩