nginxのserver_nameを複数設定する
Nginxつかってて、vhostをきりたいときで、同一の名前で同じディレクティブで受けたいときってありますよね。
そういうときって、 server_name
に複数並べて、下記みたいに書くと思います。
server {
listen 80;
server_name example.org www.example.org;
...
}
ここで、この server_name
は上限どれくらいかな?
って気になったので調べた。
server_names_hash_max_size
と server_names_hash_bucket_size
を増やせばいいみたい。
server_names_hash_max_size
は デフォルトだと 32 らしい。
server_names_hash_max_size
から増やしていけって書いてあった。
AWS Web Console から各IAMユーザー自身でパスワード変更およびMFAを設定できるIAM Policy
普段AWSのWebコンソールを利用していると、IAMで権限管理している人が多いと思います。
よくあるケースとして、IAMユーザーを新規発行してあげたときに、他の人にアカウントを作って初期パスワードを教えてあげたけど、その後はそのユーザー本人が自分でパスワードの変更やMFAの設定をしてほしいな思いました。
こんなとき、権限管理はちゃんとしたいから、余計な権限をあげたくないけど、どんな権限を与えたらいいのか分からなかったので、
Web コンソールからIAMユーザー本人がIAMユーザーのパスワードとMFAの設定をできる
という権限を設定できるIAMポリシーを作りました。
下記のようになります。
※ <account-id>の部分をあなたのAWSアカウントIDに置き換えてください
Policyの中にある ${aws:username} みたいなのは IAM Policy Variables といってユーザー名などを動的に取得する事ができる記述方法です。
IAM Policy Variables について 詳しい説明はこちら。
IAM Policy Variables Overview - AWS Identity and Access Management
本日は以上です。
P.S. AWSってアドベントカレンダーないのかな?
AWS Policy Simulator で簡単 IAM Policy チェック
ついに満を持して(?)リリースされましたね!
Amazon Web Services ブログ: 【AWS発表】 AWS Identity and Access Management (IAM) Policy Simulator
※ちなみに、ここで紹介されている説明動画はすごく分かりやすいです。
よく IAM Policy で「これ、うまく設定できてる?」というのが試すまで分からない事が多いので、とてもうれしいですね。
早速ですが使ってみました。
新規作成するため、AWS Policy Generator を一旦利用します。
AWS Policy Generator
※ここはIAMのタブの新規作成でもいいです。
適当に入力して、
とりあえず、こんなポリシーができました。
{ "Statement": [ { "Sid": "Stmt1383759642380", "Action": [ "ec2:DescribeInstances", "ec2:StartInstances", "ec2:StopInstances" ], "Effect": "Allow", "Resource": "arn:aws:ec2:ap-northeast-1:{your-account-id}:instance/*" } ] }
ここでは、「ec2:DescribeInstances」,「ec2:StartInstances」,「ec2:StopInstances」の3つを自分のアカウントのEC2インスタンスに対して許可しています。
では早速 Policy Simulator をつかっていきます。
画面を開き、右側上部のセレクトメニューから「Mode:New Policy」 を選択して、
左側の「Policy Sandbox」に上記の Policy をペーストして、「Apply」を押します。
次に、右側の「Policy Simulator」で 「Amazon EC2」 を選択し、矢印のドロップダウンから、 「DescribeInstances」,「StartInstances」,「StopInstances」,「TerminateInstances」にチェックを入れます。
「Simulation Settings」をクリックし、「Resource Name Format」に「arn:aws:ec2:ap-northeast-1:{your-account-id}:instance/*」(ここでは自分のアカウントのEC2インスタンスを対象にPolicyの効力をチェックしたいので)と入力して「Run Simulation」を押します。
すると、先ほど許可していた、「DescribeInstances」,「StartInstances」,「StopInstances」の箇所に 「allowed」の文字が!
許可していない「TerminateInstances」には「denied」の表示がされ、このPolicyではインスタンスのTerminateができない事を表しています。
このような感じで簡単にPolicyをチェックする事ができました!
AWSはツールも充実していって、どんどん便利になっていきますね!
これからもどんどんAWS使っていきます。
もうちょっとIAMネタを書くかな・・・
Gitのフックスクリプトが実行されてないかも?というとき
色々原因はあると思いますが、その中の一つではまったものを紹介します。
それは
exec git update-server-info
です。
これがあるとその行以降のコマンドは実行されません。
まず最初に結論から
どうすれば良いか。 exec を消して
git update-server-info
とします。
※ http(s) ごしでリポジトリにアクセスしない場合は消してしまっても良いです。
ちょっと説明
gitのbareリポジトリ作ったばっかりの状態のhookscriptでは
post-update.sample
#!/bin/sh
#
# An example hook script to prepare a packed repository for use over
# dumb transports.
#
# To enable this hook, rename this file to "post-update".
exec git update-server-info
みたいな感じでなってる。
たとえば何かを編集したときに、
#!/bin/sh
#
# An example hook script to prepare a packed repository for use over
# dumb transports.
#
# To enable this hook, rename this file to "post-update".
exec git update-server-info
echo 'hogehoge'
みたいな感じで書いちゃうと、
echo 'hogehoge'
の部分が実行されません。 それは
exec git update-server-info
があるからです。
exec コマンドとは
execに指定したコマンドを実行する。このコマンドを実行する際に、新しいプロセスを作成せずに、現在のジョブと置き換えて実行される。
というものです。
ですので、
exec git update-server-info
の時点で終わってしまい、
echo 'hogehoge'
が実行されないのです。
お気をつけください。
Ruby の aws-sdk を使って色々操作する-その1
最近、AWS を触っています。
私は Ruby を使いがちなので、Ruby の aws-sdk をつかって 様々な操作をする事が多いです。
その中でいくつか決まった書き方をする事が多いので、少しづつやり方をまとめておきます。
■自らのEC2インスタンス情報を取得する(EBSのVolumeIDなどもここから取れる)
require 'aws-sdk' # 設定(IAM Roleなどを利用しているときは key と secret はいらない) AWS.config( access_key_id: 'REPLACE_WITH_ACCESS_KEY_ID', secret_access_key: 'REPLACE_WITH_SECRET_ACCESS_KEY', ec2_endpoint: 'ec2.ap-northeast-1.amazonaws.com' ) # defaultは us-east-1 です # 東京リージョンであれば下記のように ec2 = AWS::EC2.new(region: 'ap-northeast-1') # meta-dataサーバーから自身のinstance_idを取得 instance_id = `curl -s http://169.254.169.254/latest/meta-data/instance-id` # インスタンス情報を取得 instance = ec2.instances[instance_id]
少しづつ増やしていこうと思います。
また書きます。
GitoliteをつかってGitリポジトリを権限管理する
やりたかった事
対象のGitのリポジトリを
・限られたユーザーにしかPUSHさせたくない
・誰でも閲覧できるようにしたい
という事がありました。
この事を解決する手段として、
1.sshプロトコルを利用し、ユーザーとグループで管理する
2.ツールを使う
Gitosis、Gitolite、etc...
が真っ先に思いついたのですが、
Gitリポジトリのあるサーバーに、ユーザーとグループたくさん作るのも嫌だったので、
ツールを使う事にし、今回はGitoliteを利用する事にしました。
導入手順
つらつらと書きます。
※下の方に入れる途中で起きたエラーと解決策を書いてあります
まずgitユーザーを作成して、sudo権限をつけておきます。
※sudoつけずにrootで作業してもいいです。
gitユーザーでの作業
gitユーザーになります
ソース取得
cd /usr/local/src sudo git clone git://github.com/sitaramc/gitolite.git cd gitolite
パスの通ってる所にシンボリックリンク作成
./install -ln /usr/local/bin
$HOME/.ssh に移動(ディレクトリがなければ作成する)
mkdir ~/.ssh cd ~/.ssh
秘密鍵・公開鍵の作成
ssh-keygen -t rsa -f gitolite_id_rsa
gitoliteのセットアップ
gitolite setup -pk ~/.ssh/gitolite_id_rsa.pub
ssh configの設定
vim ~/.ssh/config
# ~/.ssh/config host localhost user gitolite hostname localhost (ここはサーバーのIP. 外部ならそれを指定) port 22 identityfile ~/.ssh/gitolite_id_rsa
ssh 周りの権限変更
chmod 600 ~/.ssh/* chmod 700 ~/.ssh
clone する
cd ~ git clone gitolite@localhost:gitolite-admin ・・・(1)
別ユーザーを作成して試してみる
tomユーザー作成
sudo useradd tom su - tom <span class="deco" style="font-weight:bold;"> tomユーザーでの操作 </span> 鍵の作成 >|cterm| mkdir .ssh cd .ssh ssh-keygen -t rsa -f tom ・・・(2)
ssh 設定ファイル作成
vim ~/.ssh/config
# 基本的にidentityfile以外 管理者の設定と同じ host localhost user gitolite hostname localhost port 22 identityfile ~/.ssh/tom
ssh周りの権限設定
chmod 600 ~/.ssh/* chmod 700 ~/.ssh
ユーザー追加作業(gitユーザーでの操作)
cd {(1)でcloneしたgitolite-adminリポジトリ} vim keydir/tom.pub (ここは追加したいユーザー名 + .pub という名前でファイルを作る)
# keydir/tom.pub (2)で作成した公開鍵の内容をコピー
リポジトリ権限の設定
tomユーザーにはtestingリポジトリに書き込み権限のみ与える
vim conf/gitolite.conf
# conf/gitolite.conf # 一応グループを定義 @developer = tom repo gitolite-admin RW+ = gitolite_pub_rsa repo testing RW+ = gitolite_pub_rsa R = @developer
ファイルをpushする
※gitのuser.nameとuser.emailを設定していないときは
※git config --global user.email "you@example.com" と git config --global user.name "Your Name" でgitの設定しておくこと
git add keydir/tom.pub conf/gitolite.conf
git commit -m 'add tom key file and add testing repository permission of tom'
git push origin master
tomユーザーでの操作
testingリポジトリをcloneする
cd ~
git clone tom@localhost:testing
編集してpushしてみようとする
cd testing echo 'hoge' > README git add README git commit -m 'first Tom's commit' git push origin master
すると下記のように出力され、pushに失敗する
FATAL: W any testing tom DENIED by fall thru (or you mis-spelled the reponame) atal: The remote end hung up unexpectedly
pushできない事を確認できた。
これで一旦完了です。
実際に導入してみて、今のところうまく行っています。
これから運用フェーズだなー。。。
*** 番外編 ***(トラブルシューティングなど)
1. gitoliteの install -ln /usr/local/bin が エラー
こんなメッセージが出たとき
Can't locate Time/HiRes.pm in @INC (@INC contains: /home/gitolite/src/gitolite/src/lib /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /home/gitolite/src/gitolite/src/lib/Gitolite/Common.pm line 76. BEGIN failed--compilation aborted at /home/gitolite/src/gitolite/src/lib/Gitolite/Common.pm line 76. Compilation failed in require at gitolite/install line 15. BEGIN failed--compilation aborted at gitolite/install line 15.
解決した方法:perlのモジュールをいれる
yum install perl-Time-HiRes -y
2. ssh で Permission denied が出るとき
基本的に /var/log/secure を確認すれば分かる事が多い
みてみましょう
3. ユーザーでcloneしようとしたら、pemの設定してあるのにパスワード聞かれる
/var/log/secure に User gitolite not allowed because account is locked ってでてるときは
vim /etc/ssh/sshd_config
#UsePAM no # <- こっちをコメントアウト UsePAM yes
上記のように UsePAMを有効して sshdを再起動すると直った
4. リモートクライアントからの接続の場合でpassword聞かれてしまう場合
下記リンクを参考に
http://blog.teapla.net/archives/1843
Host gitolite・・・(3) User gitolite Hostname gitserver IdentityFile ~/.ssh/id_rsa.gitolite
のように設定していたとき、
git clone gitolite@gitserver:testing
とやるとパスワード聞かれてしまうけど、
git clone gitolite:testing
↑ (3) .ssh/config の Hostに設定したとこの名前
とするとパスワードなしでちゃんといけた。
5. リポジトリの場所変えたい
下記ドキュメントを参考にした
http://sitaramc.github.com/gitolite/dev-notes.html
デフォルトでは gitolite setup --pk xxxxx.pub を実行したユーザーのホームディレクトリになる
~/.gitolite.rc の%rc 内に
GL_REPO_BASE => 'path/to/repo'
を書くと変えれる
ソース的にはこの辺
/usr/local/src/gitolite/src/lib/Gitolite/Setup.pm
6. 大元のadminレポジトリを変える
大元は ~/.gitolite/ いかにあるが、
これは~/.gitolite.rc の GL_ADMIN_BASE に値を設定すれば変更できる