编写 Kerberos Ktutil 脚本来制作密钥表
Script Kerberos Ktutil to make keytabs
我想制作一个脚本,使用 ktutil 生成密钥表。当运行我要使用的脚本
[用户]$ script.sh 密码
#script.sh
echo "addent -password -p PRINCIPAL -k 1 -e aes256-cts-hmac-sha1-96" | ktutil
Ktutil 需要密码,这里我想使用上面的 PASSWORD 参数。我将如何通过密码争论?
使用 GNU bash:
user="PRINCIPAL"
pass="topsecret"
printf "%b" "addent -password -p $user -k 1 -e aes256-cts-hmac-sha1-96\n$pass\nwrite_kt $user.keytab" | ktutil
printf "%b" "read_kt $user.keytab\nlist" | ktutil
输出:
slot KVNO Principal
---- ---- ---------------------------------------------------------------------
1 1 PRINCIPAL@YOURDOMAIN
Python
中的一个版本
https://github.com/Tagar/stuff/blob/master/keytab.py
在 shell 中将密码通过管道传递给 ktutil 是不安全的,因为密码将在进程列表中可见。
由于此 Python 脚本仅使用 pexpect 库与 ktutil 交互,因此可以使用 expect.
实现与纯 shell 脚本相同的功能
希望对您有所帮助。
要同时创建多个组织 keytab 和默认的 hbase、pipe、hdfs keytab,您可以 运行 我刚刚创建的以下脚本:
#!/bin/bash
read -p "Please enter space-delimited list of ORGS to create: " NEW_ORGS
clear
#echo "################# CREATE KEYTABS ############################"
#echo ""
kdestroy
for i in $NEW_ORGS
do
printf "%b" "addent -password -p ${i} -k 1 -e aes256-cts-hmac-sha1-96\n${i}\nwrite_kt ${i}.keytab" | ktutil
printf "%b" "read_kt ${i}.keytab\nlist" | ktutil
done
echo ""
if [ ! -e /home/eip/.keytabs/hbase.keytab ]
then
printf "%b" "addent -password -p hbase -k 1 -e aes256-cts-hmac-sha1-96\nhbase\nwrite_kt hbase.keytab" | ktutil
printf "%b" "read_kt hbase.keytab\nlist" | ktutil
fi
exit 0
享受
import os, getpass
from subprocess import run, PIPE
import sys
userndomain, passwd, enctype = 'username@DOMAIN', 'secret', 'arcfour-hmac-md5'
input_load = f"""add_entry -password -p {userndomain} -k 1 -e {enctype}
{passwd}
write_kt {user}.keytab
quit
"""
p = run(['ktutil'], stdout=PIPE, input=input_load, encoding='ascii')
使用expect
将密码保留在进程列表之外:
expect << EOF
set timeout 10
spawn /usr/bin/ktutil
expect {
"ktutil: " { send "addent -password -p $PRINCIPAL -k 1 -e $METHOD\r" }
timeout { puts "Timeout waiting for ktutil prompt."; exit 1; }
}
expect {
-re "Password for \\S+: " { send "$PASSWORD\r" }
timeout { puts "Timeout waiting for password prompt."; exit 1; }
}
expect {
"ktutil: " { send "wkt $KEYTAB_TMP\r" }
}
expect {
"ktutil: " { send "q\r" }
}
EOF
或使用<<HERE
文档提供stdin
,但如果addent
提示失败,您可能会得到stdout
中的密码:
/usr/bin/ktutil <<EOF
addent -password -p $PRINCIPAL -k 1 -e $METHOD
$PASSWORD
wkt $KEYTAB_TMP
q
EOF
我遵循了 Cyrus 接受的答案,但一直点击
“添加新条目时无法读取密码”
如Arrow_Raider
所述
我能够通过使用下面的稍微相似的结果来克服错误。
{
echo "addent -password -p ${user} -k 1 -e RC4-HMAC"
sleep 1
echo "${pass}"
sleep 1
echo "write_kt my.keytab"
} |
ktutil
我想制作一个脚本,使用 ktutil 生成密钥表。当运行我要使用的脚本 [用户]$ script.sh 密码
#script.sh
echo "addent -password -p PRINCIPAL -k 1 -e aes256-cts-hmac-sha1-96" | ktutil
Ktutil 需要密码,这里我想使用上面的 PASSWORD 参数。我将如何通过密码争论?
使用 GNU bash:
user="PRINCIPAL"
pass="topsecret"
printf "%b" "addent -password -p $user -k 1 -e aes256-cts-hmac-sha1-96\n$pass\nwrite_kt $user.keytab" | ktutil
printf "%b" "read_kt $user.keytab\nlist" | ktutil
输出:
slot KVNO Principal ---- ---- --------------------------------------------------------------------- 1 1 PRINCIPAL@YOURDOMAIN
Python
中的一个版本https://github.com/Tagar/stuff/blob/master/keytab.py
在 shell 中将密码通过管道传递给 ktutil 是不安全的,因为密码将在进程列表中可见。
由于此 Python 脚本仅使用 pexpect 库与 ktutil 交互,因此可以使用 expect.
实现与纯 shell 脚本相同的功能希望对您有所帮助。
要同时创建多个组织 keytab 和默认的 hbase、pipe、hdfs keytab,您可以 运行 我刚刚创建的以下脚本:
#!/bin/bash
read -p "Please enter space-delimited list of ORGS to create: " NEW_ORGS
clear
#echo "################# CREATE KEYTABS ############################"
#echo ""
kdestroy
for i in $NEW_ORGS
do
printf "%b" "addent -password -p ${i} -k 1 -e aes256-cts-hmac-sha1-96\n${i}\nwrite_kt ${i}.keytab" | ktutil
printf "%b" "read_kt ${i}.keytab\nlist" | ktutil
done
echo ""
if [ ! -e /home/eip/.keytabs/hbase.keytab ]
then
printf "%b" "addent -password -p hbase -k 1 -e aes256-cts-hmac-sha1-96\nhbase\nwrite_kt hbase.keytab" | ktutil
printf "%b" "read_kt hbase.keytab\nlist" | ktutil
fi
exit 0
享受
import os, getpass
from subprocess import run, PIPE
import sys
userndomain, passwd, enctype = 'username@DOMAIN', 'secret', 'arcfour-hmac-md5'
input_load = f"""add_entry -password -p {userndomain} -k 1 -e {enctype}
{passwd}
write_kt {user}.keytab
quit
"""
p = run(['ktutil'], stdout=PIPE, input=input_load, encoding='ascii')
使用expect
将密码保留在进程列表之外:
expect << EOF
set timeout 10
spawn /usr/bin/ktutil
expect {
"ktutil: " { send "addent -password -p $PRINCIPAL -k 1 -e $METHOD\r" }
timeout { puts "Timeout waiting for ktutil prompt."; exit 1; }
}
expect {
-re "Password for \\S+: " { send "$PASSWORD\r" }
timeout { puts "Timeout waiting for password prompt."; exit 1; }
}
expect {
"ktutil: " { send "wkt $KEYTAB_TMP\r" }
}
expect {
"ktutil: " { send "q\r" }
}
EOF
或使用<<HERE
文档提供stdin
,但如果addent
提示失败,您可能会得到stdout
中的密码:
/usr/bin/ktutil <<EOF
addent -password -p $PRINCIPAL -k 1 -e $METHOD
$PASSWORD
wkt $KEYTAB_TMP
q
EOF
我遵循了 Cyrus 接受的答案,但一直点击
“添加新条目时无法读取密码” 如Arrow_Raider
所述我能够通过使用下面的稍微相似的结果来克服错误。
{
echo "addent -password -p ${user} -k 1 -e RC4-HMAC"
sleep 1
echo "${pass}"
sleep 1
echo "write_kt my.keytab"
} |
ktutil