mirror of https://github.com/jumpserver/jumpserver
				
				
				
			
							parent
							
								
									951467f8ca
								
							
						
					
					
						commit
						39a0350e08
					
				| 
						 | 
				
			
			@ -406,8 +406,8 @@ class Tasks(Command):
 | 
			
		|||
        use template to render pushed sudoers file
 | 
			
		||||
        :return:
 | 
			
		||||
        """
 | 
			
		||||
        module_args1 = 'src=%s dest=%s owner=root group=root mode=0440' % (file_path, '/etc/sudoers')
 | 
			
		||||
        ret1 = self.__run(module_args1, "copy")
 | 
			
		||||
        module_args1 = 'test'
 | 
			
		||||
        ret1 = self.__run(module_args1, "script")
 | 
			
		||||
        module_args2 = 'visudo -c | grep "parsed OK" &> /dev/null && echo "ok" || echo "failed"'
 | 
			
		||||
        ret2 = self.__run(module_args2, "shell")
 | 
			
		||||
        ret2_status = [host_value.get("stdout") for host_value in ret2["result"]["contacted"].values()]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -337,6 +337,40 @@ def get_role_info(role_id, type="all"):
 | 
			
		|||
        return u"不支持的查询"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_role_push_host(role):
 | 
			
		||||
    """
 | 
			
		||||
    get the role push host
 | 
			
		||||
    :return: the asset object
 | 
			
		||||
    """
 | 
			
		||||
    # 计算该role 所有push记录 总共推送的主机
 | 
			
		||||
    assets = []
 | 
			
		||||
    asset_groups = []
 | 
			
		||||
    for push in role.perm_push.all():
 | 
			
		||||
        assets.extend(push.asset.all())
 | 
			
		||||
        asset_groups.extend(push.asset_group.all())
 | 
			
		||||
    group_assets = []
 | 
			
		||||
    for asset_group in asset_groups:
 | 
			
		||||
        group_assets.extend(asset_group.asset_set.all())
 | 
			
		||||
    cacl_assets = set(assets) | set(group_assets)
 | 
			
		||||
 | 
			
		||||
    # 计算所有主机 在push记录里面的 使用密码和使用秘钥状况
 | 
			
		||||
    result = []
 | 
			
		||||
    for asset in cacl_assets:
 | 
			
		||||
        all_push = asset.perm_push.all()
 | 
			
		||||
        if True in [push.is_password for push in all_push if role in push.role.all()]:
 | 
			
		||||
            is_password = u"是"
 | 
			
		||||
        else:
 | 
			
		||||
            is_password = u"否"
 | 
			
		||||
        if True in [push.is_public_key for push in all_push if role in push.role.all()]:
 | 
			
		||||
            is_public_key = u"是"
 | 
			
		||||
        else:
 | 
			
		||||
            is_public_key = u"否"
 | 
			
		||||
        result.append({"ip": asset.ip,
 | 
			
		||||
                       "group": ','.join([group.name for group in asset.group.all()]),
 | 
			
		||||
                       "password": is_password,
 | 
			
		||||
                       "pubkey": is_public_key})
 | 
			
		||||
    return result
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
    print get_role_info(1)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -89,7 +89,7 @@ def gen_sudo(role_custom, role_name, role_chosen):
 | 
			
		|||
    return sudo_file_path
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_sudo_file(sudo_chosen_aliase, sudo_chosen_obj):
 | 
			
		||||
def get_add_sudo_script(sudo_chosen_aliase, sudo_chosen_obj):
 | 
			
		||||
    """
 | 
			
		||||
    get the sudo file
 | 
			
		||||
    :param kwargs:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,9 +11,9 @@ from jasset.models     import Asset, AssetGroup
 | 
			
		|||
from jperm.models      import PermRole, PermRule, PermSudo, PermPush
 | 
			
		||||
from jumpserver.models import Setting
 | 
			
		||||
 | 
			
		||||
from jperm.utils       import updates_dict, gen_keys, get_rand_pass, get_sudo_file
 | 
			
		||||
from jperm.utils       import updates_dict, gen_keys, get_rand_pass, get_add_sudo_script
 | 
			
		||||
from jperm.ansible_api import Tasks
 | 
			
		||||
from jperm.perm_api    import get_role_info
 | 
			
		||||
from jperm.perm_api    import get_role_info, get_role_push_host
 | 
			
		||||
 | 
			
		||||
from jumpserver.api    import my_render, get_object, CRYPTOR
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -338,6 +338,7 @@ def perm_role_detail(request):
 | 
			
		|||
        asset_groups = role_info.get("asset_groups")
 | 
			
		||||
        users = role_info.get("users")
 | 
			
		||||
        user_groups = role_info.get("user_groups")
 | 
			
		||||
        push_info = get_role_push_host(PermRole.objects.get(id=role_id))
 | 
			
		||||
 | 
			
		||||
        return my_render('jperm/perm_role_detail.html', locals(), request)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -460,10 +461,10 @@ def perm_role_push(request):
 | 
			
		|||
        if key_push:
 | 
			
		||||
            ret["password_push"] = task.add_multi_user(**role_pass)
 | 
			
		||||
            if ret["password_push"].get("status") != "success":
 | 
			
		||||
                ret_failed["step2-1"] == "failed"
 | 
			
		||||
                ret_failed["step2-1"] = "failed"
 | 
			
		||||
            ret["key_push"] = task.push_multi_key(**role_key)
 | 
			
		||||
            if ret["key_push"].get("status") != "success":
 | 
			
		||||
                ret_failed["step2-2"] == "failed"
 | 
			
		||||
                ret_failed["step2-2"] = "failed"
 | 
			
		||||
 | 
			
		||||
        # 3. 推送sudo配置文件
 | 
			
		||||
        sudo_chosen_aliase = {}
 | 
			
		||||
| 
						 | 
				
			
			@ -473,17 +474,21 @@ def perm_role_push(request):
 | 
			
		|||
            sudo_alias.extend(role_alias)
 | 
			
		||||
            sudo_chosen_aliase[role.name] = ','.join(role_alias)
 | 
			
		||||
        sudo_chosen_obj = [PermSudo.objects.get(name=sudo_name) for sudo_name in set(sudo_alias)]
 | 
			
		||||
        sudo_file = get_sudo_file(sudo_chosen_aliase, sudo_chosen_obj)
 | 
			
		||||
        ret_sudo = task.push_sudo_file(sudo_file)
 | 
			
		||||
        if ret_sudo["step1"] != "ok" and ret_sudo["step2"] != "ok":
 | 
			
		||||
            ret_failed["step3"] == "failed"
 | 
			
		||||
 | 
			
		||||
        add_sudo_script = get_add_sudo_script(sudo_chosen_aliase, sudo_chosen_obj)
 | 
			
		||||
        ret_sudo = task.push_sudo_file(add_sudo_script)
 | 
			
		||||
 | 
			
		||||
        if ret_sudo["step1"] != "ok" or ret_sudo["step2"] != "ok":
 | 
			
		||||
            ret_failed["step3"] = "failed"
 | 
			
		||||
        os.remove(add_sudo_script)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        # 结果汇总统计
 | 
			
		||||
        if ret_failed:
 | 
			
		||||
            # 推送失败
 | 
			
		||||
            msg = u"推送失败, 原因: %s 失败" % ','.join(ret_failed.keys())
 | 
			
		||||
            error = u"推送失败, 原因: %s 失败" % ','.join(ret_failed.keys())
 | 
			
		||||
        else:
 | 
			
		||||
            # 推送成功 写会push表
 | 
			
		||||
            # 推送成功 回写push表
 | 
			
		||||
            msg = u"推送系统角色: %s" % ','.join(role_names)
 | 
			
		||||
            push = PermPush(is_public_key=bool(key_push), is_password=bool(password_push))
 | 
			
		||||
            push.save()
 | 
			
		||||
| 
						 | 
				
			
			@ -546,7 +551,7 @@ def perm_sudo_add(request):
 | 
			
		|||
        comment = request.POST.get("sudo_comment")
 | 
			
		||||
        commands = request.POST.get("sudo_commands")
 | 
			
		||||
 | 
			
		||||
        sudo = PermSudo(name=name, comment=comment, commands=commands)
 | 
			
		||||
        sudo = PermSudo(name=name.strip(), comment=comment, commands=commands.strip())
 | 
			
		||||
        sudo.save()
 | 
			
		||||
 | 
			
		||||
        msg = u"添加Sudo命令别名: %s" % name
 | 
			
		||||
| 
						 | 
				
			
			@ -586,8 +591,8 @@ def perm_sudo_edit(request):
 | 
			
		|||
        name = request.POST.get("sudo_name")
 | 
			
		||||
        commands = request.POST.get("sudo_commands")
 | 
			
		||||
        comment = request.POST.get("sudo_comment")
 | 
			
		||||
        sudo.name = name
 | 
			
		||||
        sudo.commands = commands
 | 
			
		||||
        sudo.name = name.strip()
 | 
			
		||||
        sudo.commands = commands.strip()
 | 
			
		||||
        sudo.comment = comment
 | 
			
		||||
        sudo.save()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,7 +5,6 @@
 | 
			
		|||
{% block content %}
 | 
			
		||||
    {% include 'nav_cat_bar.html' %}
 | 
			
		||||
    <div class="wrapper wrapper-content animated fadeInRight">
 | 
			
		||||
 | 
			
		||||
        <div class="row">
 | 
			
		||||
            <div class="col-lg-4">
 | 
			
		||||
                <div class="ibox float-e-margins">
 | 
			
		||||
| 
						 | 
				
			
			@ -51,8 +50,8 @@
 | 
			
		|||
                            </div>
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-lg-4">
 | 
			
		||||
                <div class="ibox float-e-margins">
 | 
			
		||||
                    <div class="ibox-title">
 | 
			
		||||
| 
						 | 
				
			
			@ -97,8 +96,8 @@
 | 
			
		|||
                            </div>
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-lg-4">
 | 
			
		||||
                <div class="ibox float-e-margins">
 | 
			
		||||
                    <div class="ibox-title">
 | 
			
		||||
| 
						 | 
				
			
			@ -143,8 +142,60 @@
 | 
			
		|||
                            </div>
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="row">
 | 
			
		||||
            <div class="col-lg-12">
 | 
			
		||||
                <div class="ibox float-e-margins">
 | 
			
		||||
                    <div class="ibox-title">
 | 
			
		||||
                        <span class="label label-primary"><b>推送主机</b></span>
 | 
			
		||||
                        <div class="ibox-tools">
 | 
			
		||||
                            <a class="collapse-link">
 | 
			
		||||
                                <i class="fa fa-chevron-up"></i>
 | 
			
		||||
                            </a>
 | 
			
		||||
                            <a class="dropdown-toggle" data-toggle="dropdown" href="#">
 | 
			
		||||
                                <i class="fa fa-wrench"></i>
 | 
			
		||||
                            </a>
 | 
			
		||||
                            <ul class="dropdown-menu dropdown-user">
 | 
			
		||||
                                <li><a href="#"></a>
 | 
			
		||||
                                </li>
 | 
			
		||||
                                <li><a href="#"></a>
 | 
			
		||||
                                </li>
 | 
			
		||||
                            </ul>
 | 
			
		||||
                            <a class="close-link">
 | 
			
		||||
                                <i class="fa fa-times"></i>
 | 
			
		||||
                            </a>
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div class="ibox-content">
 | 
			
		||||
                        <div>
 | 
			
		||||
                            <div class="text-left">
 | 
			
		||||
                                <table class="table table-striped" id="ugedit" >
 | 
			
		||||
                                    <thead>
 | 
			
		||||
                                        <tr>
 | 
			
		||||
                                            <th class="text-center">主机</th>
 | 
			
		||||
                                            <th class="text-center">主机组</th>
 | 
			
		||||
                                            <th class="text-center">使用密码</th>
 | 
			
		||||
                                            <th class="text-center">使用秘钥</th>
 | 
			
		||||
                                        </tr>
 | 
			
		||||
                                    </thead>
 | 
			
		||||
                                    <tbody>
 | 
			
		||||
                                    {% for host in push_info %}
 | 
			
		||||
                                        <tr class="gradeX">
 | 
			
		||||
                                            <td class="text-center"> {{ host.ip }} </td>
 | 
			
		||||
                                            <td class="text-center"> {{ host.group }} </td>
 | 
			
		||||
                                            <td class="text-center"> {{ host.password }} </td>
 | 
			
		||||
                                            <td class="text-center"> {{ host.pubkey }} </td>
 | 
			
		||||
                                        </tr>
 | 
			
		||||
                                    {% endfor %}
 | 
			
		||||
                                    </tbody>
 | 
			
		||||
                                </table>
 | 
			
		||||
                            </div>
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,106 +1,31 @@
 | 
			
		|||
## Sudoers allows particular users to run various commands as
 | 
			
		||||
## the root user, without needing the root password.
 | 
			
		||||
##
 | 
			
		||||
## Examples are provided at the bottom of the file for collections
 | 
			
		||||
## of related commands, which can then be delegated out to particular
 | 
			
		||||
## users or groups.
 | 
			
		||||
##
 | 
			
		||||
## This file must be edited with the 'visudo' command.
 | 
			
		||||
 | 
			
		||||
## Host Aliases
 | 
			
		||||
## Groups of machines. You may prefer to use hostnames (perhaps using
 | 
			
		||||
## wildcards for entire domains) or IP addresses instead.
 | 
			
		||||
# Host_Alias     FILESERVERS = fs1, fs2
 | 
			
		||||
# Host_Alias     MAILSERVERS = smtp, smtp2
 | 
			
		||||
 | 
			
		||||
## User Aliases
 | 
			
		||||
## These aren't often necessary, as you can use regular groups
 | 
			
		||||
## (ie, from files, LDAP, NIS, etc) in this file - just use %groupname
 | 
			
		||||
## rather than USERALIAS
 | 
			
		||||
# User_Alias ADMINS = jsmith, mikem
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Command Aliases
 | 
			
		||||
## These are groups of related commands...
 | 
			
		||||
 | 
			
		||||
{% for sudo in sudo_chosen_obj %}
 | 
			
		||||
Cmnd_Alias {{ sudo.name }} = {{ sudo.commands }}
 | 
			
		||||
{% endfor %}
 | 
			
		||||
sudo_file=/etc/sudoers
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Add Command Aliases
 | 
			
		||||
add_cmd_alias() {
 | 
			
		||||
    {% for sudo in sudo_chosen_obj %}
 | 
			
		||||
    if $(grep '^Cmnd_Alias {{ sudo.name }}' ${sudo_file} &> /dev/null); then
 | 
			
		||||
        sed -i 's@^Cmnd_Alias.*{{ sudo.name }}.*@Cmnd_Alias {{ sudo.name }} = {{ sudo.commands }}@g' ${sudo_file}
 | 
			
		||||
    else
 | 
			
		||||
        echo "Cmnd_Alias {{ sudo.name }} = {{ sudo.commands }}" >> ${sudo_file}
 | 
			
		||||
    fi
 | 
			
		||||
    {% endfor %}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
add_role_chosen() {
 | 
			
		||||
    {% for role, alias in sudo_chosen_aliase.items %}
 | 
			
		||||
    if $(grep '^{{ role }}' ${sudo_file} &> /dev/null); then
 | 
			
		||||
        sed -i 's@^{{ role }}.*@{{ role }} ALL = {{ alias }}@g' ${sudo_file}
 | 
			
		||||
    else
 | 
			
		||||
        echo "{{ role }} ALL = {{ alias }}"  >> ${sudo_file}
 | 
			
		||||
    fi
 | 
			
		||||
    {% endfor %}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Defaults specification
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
 | 
			
		||||
#         You have to run "ssh -t hostname sudo <cmd>".
 | 
			
		||||
#
 | 
			
		||||
Defaults    requiretty
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Refuse to run if unable to disable echo on the tty. This setting should also be
 | 
			
		||||
# changed in order to be able to use sudo without a tty. See requiretty above.
 | 
			
		||||
#
 | 
			
		||||
Defaults   !visiblepw
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Preserving HOME has security implications since many programs
 | 
			
		||||
# use it when searching for configuration files. Note that HOME
 | 
			
		||||
# is already set when the the env_reset option is enabled, so
 | 
			
		||||
# this option is only effective for configurations where either
 | 
			
		||||
# env_reset is disabled or HOME is present in the env_keep list.
 | 
			
		||||
#
 | 
			
		||||
Defaults    always_set_home
 | 
			
		||||
 | 
			
		||||
Defaults    env_reset
 | 
			
		||||
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
 | 
			
		||||
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
 | 
			
		||||
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
 | 
			
		||||
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
 | 
			
		||||
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Adding HOME to env_keep may enable a user to run unrestricted
 | 
			
		||||
# commands via sudo.
 | 
			
		||||
#
 | 
			
		||||
# Defaults   env_keep += "HOME"
 | 
			
		||||
 | 
			
		||||
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
 | 
			
		||||
 | 
			
		||||
## Next comes the main part: which users can run what software on
 | 
			
		||||
## which machines (the sudoers file can be shared between multiple
 | 
			
		||||
## systems).
 | 
			
		||||
## Syntax:
 | 
			
		||||
##
 | 
			
		||||
##      user    MACHINE=COMMANDS
 | 
			
		||||
##
 | 
			
		||||
## The COMMANDS section may have other options added to it.
 | 
			
		||||
##
 | 
			
		||||
## Allow root to run any commands anywhere
 | 
			
		||||
root    ALL=(ALL)       ALL
 | 
			
		||||
 | 
			
		||||
{% for role, alias in sudo_chosen_aliase.items %}
 | 
			
		||||
{{ role }} ALL = {{ alias }}
 | 
			
		||||
{% endfor %}
 | 
			
		||||
 | 
			
		||||
## Allows members of the 'sys' group to run networking, software,
 | 
			
		||||
## service management apps and more.
 | 
			
		||||
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS
 | 
			
		||||
 | 
			
		||||
## Allows people in group wheel to run all commands
 | 
			
		||||
%wheel  ALL=(ALL)       ALL
 | 
			
		||||
 | 
			
		||||
## Same thing without a password
 | 
			
		||||
# %wheel        ALL=(ALL)       NOPASSWD: ALL
 | 
			
		||||
 | 
			
		||||
## Allows members of the users group to mount and unmount the
 | 
			
		||||
## cdrom as root
 | 
			
		||||
# %users  ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom
 | 
			
		||||
 | 
			
		||||
## Allows members of the users group to shutdown this system
 | 
			
		||||
# %users  localhost=/sbin/shutdown -h now
 | 
			
		||||
 | 
			
		||||
## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
 | 
			
		||||
#includedir /etc/sudoers.d
 | 
			
		||||
add_cmd_alias
 | 
			
		||||
add_role_chosen
 | 
			
		||||
		Loading…
	
		Reference in New Issue