แแกแขแแ แแฃแแแ, แกแฃแแแก แแแแแ แแแแแ แแแแ แแแแแแ แคแแแแแแแก แจแแแแแ แกแแ /etc/sudoers.แ ะธ แแแแฃแแ, แแ แแแกแแฆแแแแก แแแขแแ แแแแชแแ แแแแฎแแ แชแแแแแ แแแแแงแแแแแแ ~/.ssh/authorized_keys. แแฃแแชแ แแแคแ แแกแขแ แฃแฅแขแฃแ แแก แแ แแแกแแแ แแ แแแ แฉแแแแแ แแ แฃแคแแแแแแแก แชแแแขแ แแแแแแแฃแแ แแแ แแแแก แกแฃแ แแแแ. แแฆแแก แจแแแซแแแแ แแ แกแแแแแแแก แแแแแฌแงแแแขแแก แ แแแแแแแแ แแแ แแแแขแ:
- แแแแคแแแฃแ แแชแแแก แแแ แแแแก แกแแกแขแแแ - แจแแค, แแแฏแแแแแ, แจแแฃแซแแแแแแแ, แแแ แแแ
- Active Directory + แกแกแกแ
- แกแฎแแแแแกแฎแแ แแแ แแแ แกแแแแ แกแแ แแแขแแแแกแ แแ แคแแแแแก แฎแแแแ แ แแแแฅแขแแ แแแแก แกแแฎแแ
แฉแแแ แกแฃแแแแฅแขแฃแ แ แแแ แแ, แชแแแขแ แแแแแแแฃแแ แแแ แแแแก แกแแฃแแแแแกแ แแแ แแแแขแ แแแแแช แแแแแแแแชแแแ Active Directory + แกแกแกแ. แแ แแแแแแแแก แฃแแแ แแขแแกแแแแแแ:
- แแแแแแแแแ แแ แแ แชแแแขแ แแแแแแแฃแแ แแแแฎแแแ แแแแแก แแแ แแฅแขแแ แแ.
- แฃแคแแแแแแแก แแแแแฌแแแแแ sudo แแแแแแแแแแฃแแแ แแแแฎแแแ แแแแแก แแแแแขแแแแ แฃแกแแคแ แแฎแแแแแก แแแแแ แแขแฃแ แฏแแฃแคแจแ.
- Linux-แแก แกแฎแแแแแกแฎแแ แกแแกแขแแแแก แจแแแแฎแแแแแจแ, แแแแคแแแฃแ แแชแแแก แกแแกแขแแแแแแก แแแแแงแแแแแแกแแก OS-แแก แแแกแแแแแแแ แกแแญแแ แ แฎแแแแ แแแแแขแแแแแ แจแแแแฌแแแแแแแก แแแแแ แแแ.
แแฆแแแแแแแแ แแแแแแแฅแขแ แกแแแชแแแแฃแ แแ แแแแแแแแ แแแแจแแ แก Active Directory + แกแกแกแ แฃแคแแแแแแแก แแแ แแแแกแแแแก sudo แแ แจแแแแฎแแ แกแจ แแแกแแฆแแแแแ แแ แ แกแแชแแแจแ.
แแกแ แ แแ, แแแ แแแแ แแแซแแแฃแ แกแแฉแฃแแแจแ แแแแงแแแ, แแแ แแแแ แแ แฎแแแแแขแ แแกแฌแแ แแ แแ แแแกแขแ แ แแแแแแแแ.
แฌแแแ
แแแแกแ
โ Active Directory แแแแแแ testopf.แแแแแแแแ แแแ Windows Server 2012 R2-แแ.
- Linux แฐแแกแขแ, แ แแแแแแช แแฃแจแแแแก Centos 7-แแ
โ แแแแคแแแฃแ แแ แแแฃแแ แแแขแแ แแแแชแแแก แแแแแงแแแแแแ แกแกแกแ
แแ แแแ แแแแแกแแแแแ แชแแแแก แกแฅแแแแก Active Directoryแแกแ แ แแ, แฉแแแ แแแแแฌแแแแ แงแแแแแคแแ แก แกแแขแแกแขแ แแแ แแแแจแ แแ แแฎแแแแ แแแแก แจแแแแแ แแแแแแแแ แชแแแแแแแแแก แกแแแฃแจแแ แแแคแ แแกแขแ แฃแฅแขแฃแ แแจแ. แแแแแ แแฆแแแแจแแ, แ แแ แงแแแแ แชแแแแแแแ แแแแแแแแแแ แแฃแแแ แแ, แคแแฅแขแแแ แแแแ, แแฎแแแแ แกแแญแแ แ แแขแ แแแฃแขแแแกแ แแ แแแแกแแแก แแแแขแแแ.
แแแฅแแแแแแ 1: แแแแขแ แแแ sudo แ แแแแแแก แแแจแแแแแแ Active Directory.
แฌแ แแแแก แแแกแแคแแ แแแแแแแแ Active Directory แแฅแแแ แฃแแแ แฉแแแแขแแแ แแแ แฃแแฎแแแกแ แแแ แกแแ
ldifde -i -f schema.ActiveDirectory -c dc=X dc=testopf,dc=local
(แแ แแแแแแแฌแงแแแ แแฅแแแแ แฆแแ แแแฃแแแแแแแก แฉแแแแชแแแแแ)
แแแฎแกแแ adsiedit.msc แแ แแแฃแแแแจแแ แแแ แแแแฃแแแกแฎแแแ แแแแขแแฅแกแขแก:
แจแแฅแแแแแ แแแแงแแคแแแแแ แแแแแแแก แซแแ แจแ แแคแแแแแแแ. (แแฃแ แแฃแแแแ แฏแแฃแขแแ แแแขแแแชแแแก, แ แแ แแแแแแ แกแฌแแ แแ แแ แแ แแแฃแแจแแ แกแกแกแ แแซแแแก แแแแแก แกแฃแแแ แแแ แแแแแฅแขแแแ. แแฃแแชแ, แแแขแแแฃแ แ แแแแแ แแแแก แฉแแ แแแแกแ แแ แแฃแ แแแแแแแก แจแแกแฌแแแแแก แจแแแแแ, แแแแ แแแ, แ แแ แซแแแแ แแแแฎแแ แชแแแแแ แแแแแ แแแขแแแแแแก แฎแแแ.)
แฉแแแ แแฅแแแแ แแแ แแแ แแแแแฅแขแก, แ แแแแแแช แแแฃแแแแแก แแแแกแก แแแแงแแคแแแแแแจแ แกแฃแแแ แแแ. แกแแฎแแแ แจแแแซแแแแ แจแแแ แฉแแก แแแกแแแฃแขแฃแ แแ แแแแแแแแฃแ แแ, แ แแแแแ แแก แแแกแแฎแฃแ แแแ แแฎแแแแ แแแกแแฎแแ แฎแแแแแ แแแแแขแแคแแแแชแแแกแแแแก.
แกแฅแแแแก แแแคแแ แแแแแแแแ แจแแกแแซแแ แฎแแแแแกแแฌแแแแ แแขแ แแแฃแขแแแก แจแแ แแก, แแแแแแ แแ แจแแแแแแ:
- sudoCommand โ แแแแกแแแฆแแ แแแก, แแฃ แ แแแแแ แแ แซแแแแแแแแ แแแจแแแแฃแแ แฐแแกแขแแ แจแแกแแกแ แฃแแแแแแ.
- sudoHost โ แแแแกแแแฆแแ แแแก แ แแแแ แแแกแแแแซแแแแก แแฎแแแ แแก แ แแแ. แจแแแซแแแแ แแแแฃแกแขแแแก แ แแแแ แช ALL, แแ แแแแแแแแฃแแแฃแ แ แแแกแแแแซแแแกแแแแก แกแแฎแแแแ. แจแแกแแซแแแแแแแ แแแฆแแแก แแแแแงแแแแแแช.
- sudoUser - แแแฃแแแแแ, แ แแแแแ แแแแฎแแแ แแแแแแแก แจแแกแ แฃแแแแแก แฃแคแแแแ แแฅแแ sudo.
แแฃ แแฅแแแ แแแฃแแแแแแ แฃแกแแคแ แแฎแแแแแก แฏแแฃแคแก, แแแแแแขแแ "%" แแแจแแแ แกแแฎแแแแก แแแกแแฌแงแแกแจแ. แแฃ แฏแแฃแคแแก แกแแฎแแแจแ แแ แแก แกแแแ แชแแแแ, แกแแแแ แแแฃแแ แแ แแคแแ แแ. แแแ แแแแก แแแฎแแแแแ แแฃ แแแแกแฏแแแแแ, แกแแแ แชแแแแแแแ แแแฅแชแแแแก แแแแชแแแแก แแแฅแแแแแแ แแฆแแแก แกแกแกแ.
แแแฎ 1. sudoRole แแแแแฅแขแแแ sudoers แฅแแแแแแแงแแคแจแ แแแ แแฅแขแแ แแแจแ แซแแ แจแ
แกแฃแ แแแ 2. แฌแแแ แแแ แฃแกแแคแ แแฎแแแแแก แฏแแฃแคแแแจแ, แ แแแแแแแช แแแแแแแแฃแแแ sudoRole แแแแแฅแขแแแจแ.
แจแแแแแแ แแแงแแแแแ แแแแแแแ Linux-แแก แแฎแแ แแก.
แคแแแแจแ /แแ แ.แจ/nsswitch.conf แแแแแแขแแ แฎแแแ แคแแแแแก แแแแแก:
sudoers: files sss
แคแแแแจแ /แแ แ.แจ.sssd/sssd.conf แแแแงแแคแแแแแแจแ [sssd] แกแแ แแแกแแแแก แแแแแขแแแ sudo
cat /etc/sssd/sssd.conf | grep services
services = nss, pam, sudo
แงแแแแ แแแแ แแชแแแก แจแแแแแ, แแฅแแแ แฃแแแ แแแแกแฃแคแแแแ sssd แแแแแแแก แฅแแจแ. แแแขแแแแขแฃแ แ แแแแแฎแแแแแแ แฎแแแแ แงแแแแ 6 แกแแแแจแ, แแแแ แแ แ แแขแแ แฃแแแ แแแแแแแ แแแแแ แฎแแแก, แ แแชแ แแก แแฎแแ แแแแแแ?
sss_cache -E
แฎแจแแ แแ แฎแแแแ, แ แแ แฅแแจแแก แแแกแฃแคแแแแแแ แแ แฃแฌแงแแแก แฎแแแก. แจแแแแแ แแแฉแแ แแแ แกแแ แแแกแก, แแแกแฃแคแแแแแแ แแแแแชแแแแ แแแแแก แแ แแแฌแงแแแ แกแแ แแแกแก.
service sssd stop
rm -rf /var/lib/sss/db/*
service sssd start
แฉแแแ แแฃแแแแจแแ แแแแแ แ แแแแ แช แแแ แแแแ แแแแฎแแแ แแแแแ แแ แแแแแฌแแแแ แ แ แแ แแก แแแกแแแแก แฎแแแแแกแแฌแแแแแ แกแฃแแแก แฅแแแจ:
su user1
[user1@testsshad log]$ id
uid=1109801141(user1) gid=1109800513(domain users) groups=1109800513(domain users),1109801132(admins_)
[user1@testsshad log]$ sudo -l
[sudo] password for user1:
Matching Defaults entries for user1 on testsshad:
!visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin,
env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS",
env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES",
env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
secure_path=/sbin:/bin:/usr/sbin:/usr/bin
User user1 may run the following commands on testsshad:
(root) /usr/bin/ls, /usr/bin/cat
แฉแแแ แแแแแแก แแแแแแแแ แฉแแแแก แแแแ แ แแแแฎแแแ แแแแแแแ:
su user2
[user2@testsshad log]$ id
uid=1109801142(user2) gid=1109800513(domain users) groups=1109800513(domain users),1109801138(sudo_root)
[user2@testsshad log]$ sudo -l
Matching Defaults entries for user2 on testsshad:
!visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin,
env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS",
env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES",
env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
secure_path=/sbin:/bin:/usr/sbin:/usr/bin
User user2 may run the following commands on testsshad:
(root) ALL
แแก แแแแแแแ แกแแจแฃแแแแแแก แแแซแแแแ แชแแแขแ แแแฃแ แแ แแแแกแแแฆแแ แแ แกแฃแแ แ แแแแแ แแแแฎแแแ แแแแแก แกแฎแแแแแกแฎแแ แฏแแฃแคแแแแกแแแแก.
ssh แแแแแแจแแแแก แจแแแแฎแแ แแ แแแแแงแแแแแ Active Directory-แจแ
แกแฅแแแแก แแชแแ แ แแแคแแ แแแแแแ, แจแแกแแซแแแแแแแ ssh แแแแแแจแแแแก แจแแแแฎแแ Active Directory แแแแฎแแแ แแแแแก แแขแ แแแฃแขแแแจแ แแ แแแแ แแแแแงแแแแแ Linux แฐแแกแขแแแแ แแแขแแ แแแแชแแแกแแก.
แแแขแแ แแแแชแแ sssd-แแก แกแแจแฃแแแแแแ แฃแแแ แแงแแก แแแแคแแแฃแ แแ แแแฃแแ.
แแแแแแขแแ แกแแญแแ แ แแขแ แแแฃแขแ PowerShell แกแแ แแแขแแก แแแแแงแแแแแแ.
AddsshPublicKeyAttribute.ps1แคแฃแแฅแชแแ New-AttributeID {
$Prefix="1.2.840.113556.1.8000.2554"
$GUID=[System.Guid]::NewGuid().ToString()
$Parts=@()
$Parts+=[UIint64]::Parse($guid.SubString(0,4),โAllowHexSpecifierโ)
$Parts+=[UIint64]::Parse($guid.SubString(4,4),โAllowHexSpecifierโ)
$Parts+=[UIint64]::Parse($guid.SubString(9,4),โAllowHexSpecifierโ)
$Parts+=[UIint64]::Parse($guid.SubString(14,4),โAllowHexSpecifierโ)
$Parts+=[UIint64]::Parse($guid.SubString(19,4),โAllowHexSpecifierโ)
$Parts+=[UIint64]::Parse($guid.SubString(24,6),โAllowHexSpecifierโ)
$Parts+=[UIint64]::Parse($guid.SubString(30,6),โAllowHexSpecifierโ)
$oid=[String]::Format(ยซ{0}.{1}.{2}.{3}.{4}.{5}.{6}.{7}ยป,$prefix,$Parts[0],
$Parts[1],$Parts[2],$Parts[3],$Parts[4],$Parts[5],$Parts[6])
$oid
}
$schemaPath = (Get-ADRootDSE).schemaNamingContext
$oid = New-AttributeID
$attributes = @{
lDAPDisplayName = 'sshPublicKey';
แแขแ แแแฃแขแId = $oid;
oMSyntax = 22;
atributSyntax = "2.5.5.5";
isSingleValued = $true;
adminDescription = 'แแแแฎแแแ แแแแแก แกแแฏแแ แ แแแกแแฆแแแ SSH แจแแกแแแแกแแแแก';
}
New-ADObject -Name sshPublicKey -Type attributeSchema -Path $schemapath -OtherAttributes $attributes
$userSchema = get-adobject -SearchBase $schemapath -แคแแแขแ แ 'name -eq "user"'
$userSchema | Set-ADObject -แแแแแขแแแ @{mayContain = 'sshPublicKey'}
แแขแ แแแฃแขแแก แแแแแขแแแแก แจแแแแแ, แแฅแแแ แฃแแแ แแแแแขแแแ แแแ Active Directory Domain Services.
แแแแแ แแแแแแแแแ Active Directory แแแแฎแแแ แแแแแแแ. แฉแแแ แแแแแแฅแแแแ แแแกแแฆแแแแก แฌแงแแแแก ssh แแแแจแแ แแกแแแแก แแฅแแแแแแแก แแแกแแฎแแ แฎแแแแแ แแแแแกแแแแ แ แแแแแแแก แแแแแงแแแแแแ.
แฉแแแ แแแแฃแจแแแ PuttyGen-แก, แแแญแแ แ แฆแแแแแก "แแแแแ แแชแแ" แแ แชแแ แแแ แแแแแแแก แแแฃแกแแก แแฃแแแ แแแแ แแแแแแแแแแแแ.
แแ แแชแแกแแก แแแกแ แฃแแแแแก แจแแแแแ แฉแแแ แจแแแแแซแแแ แจแแแแแแฎแแ แกแแฏแแ แ แแ แแแ แแแ แแแกแแฆแแแแแ, แแแขแแแ แแแ แกแแฏแแ แ แแแกแแฆแแแ Active Directory แแแแฎแแแ แแแแแก แแขแ แแแฃแขแแ แแ แแกแแแแแแแแ แแ แแชแแกแแ. แแฃแแชแ, แกแแฏแแ แ แแแกแแฆแแแ แฃแแแ แแงแแก แแแแแงแแแแแฃแแ "แกแแฏแแ แ แแแกแแฆแแแ OpenSSH authorized_keys แคแแแแจแ แฉแแกแแ แแแแแ:".
แแแแแแขแแ แแแกแแฆแแแ แแแแฎแแแ แแแแแก แแขแ แแแฃแขแจแ.
แแแ แแแแขแ 1 - GUI:
แแแ แแแแขแ 2 - PowerShell:
get-aduser user1 | set-aduser -add @{sshPublicKey = 'AAAAB...XAVnX9ZRJJ0p/Q=='}
แแกแ แ แแ, แแแแแแแ แแแแฅแแก: แแแแฎแแแ แแแแแ แจแแแกแแแฃแแ sshPublicKey แแขแ แแแฃแขแแ, แแแแคแแแฃแ แแ แแแฃแแ Putty แแแแแแขแ แแแแแแจแแแแก แแแแแงแแแแแแ แแแขแแ แแแแชแแแกแแแแก. แ แฉแแแ แแ แแ แแแขแแ แ แฌแแ แขแแแ: แ แแแแ แแแแซแฃแแแ sshd แแแแแแ แแแแแฆแแก แฉแแแแแแแก แกแแญแแ แ แกแแฏแแ แ แแแกแแฆแแแ แแแแฎแแแ แแแแแก แแขแ แแแฃแขแแแแแแ. แแฃแ แแฃแแแแฃแ แแแขแแ แแแขแจแ แแแแแแแ แแแขแแ แ แกแแ แแแขแ แฌแแ แแแขแแแแ แฃแแแแแแแแแ แแแแก.
cat /usr/local/bin/fetchSSHKeysFromLDAP
#!/bin/sh
ldapsearch -h testmdt.testopf.local -xb "dc=testopf,dc=local" '(sAMAccountName='"${1%@*}"')' -D [email protected] -w superSecretPassword 'sshPublicKey' | sed -n '/^ /{H;d};/sshPublicKey:/x;$g;s/n *//g;s/sshPublicKey: //gp'
แฉแแแ แแแแแงแแแแ แแแกแแ แแแแแ แแแแแ 0500-แแ root-แแกแแแแก.
chmod 0500 /usr/local/bin/fetchSSHKeysFromLDAP
แแ แแแแแแแแจแ, แแแแแแแกแขแ แแขแแ แแก แแแแแ แแจแ แแแแแแงแแแแแ แแแ แแฅแขแแ แแแกแแแ แแแกแแแแแจแแ แแแแแ. แกแแแ แซแแแ แแแ แแแแแจแ แฃแแแ แแ แกแแแแแแแก แชแแแแ แแแแแ แแจแ แฃแคแแแแแแแก แแแแแแแแฃแ แ แแแแแแแฅแขแแ.
แแ แแแ แแแแ แซแแแแแ แแแแแแฃแแ แแแงแแแ แกแแ แแแขแจแ แแแกแ แกแฃแคแแ แกแแฎแแ แแแ แแแแก แแแแแแขแแ, แแแฃแฎแแแแแแ แแแแแแแแแ แฃแคแแแแแแแกแ.
แแแแฎแกแแแก แแแ แแแแขแ:
- แแ แแแแแฎแแ แแแ แแแก แชแแแแ แคแแแแจแ:
echo -n Supersecretpassword > /usr/local/etc/secretpass
- แแ แแแแแงแแแ แคแแแแแก แแแแแ แแแแแ 0500-แแ root-แแกแแแแก
chmod 0500 /usr/local/etc/secretpass
- ldapsearch แแแจแแแแแก แแแ แแแแขแ แแแแก แจแแชแแแ: แแแ แแแแขแ แ -w superSecretPassword แแชแแแ แแแกแแ -y /usr/local/etc/secretpass
แแฆแแแแแแแ แแแแแแแฅแขแจแ แแแแ แแแแ แแ แแ แแก sshd_config-แแก แ แแแแฅแขแแ แแแ
cat /etc/ssh/sshd_config | egrep -v -E "#|^$" | grep -E "AuthorizedKeysCommand|PubkeyAuthe"
PubkeyAuthentication yes
AuthorizedKeysCommand /usr/local/bin/fetchSSHKeysFromLDAP
AuthorizedKeysCommandUser root
แจแแแแแแ, แฉแแแ แแแฆแแแ แจแแแแแ แแแแแแแแแแ แแแแก ssh แแแแแแขแจแ แแแแคแแแฃแ แแ แแแฃแแ แแแกแแฆแแแแก แแแขแแ แแแแชแแแ:
- แแแแฎแแแ แแแแแ แฃแแ แแแแแ แกแแ แแแ แก แแแกแ แจแแกแแแแก แแแแแแแแแ.
- sshd แแแแแแ แกแแ แแแขแแก แกแแจแฃแแแแแแ แแแแแฆแแแก แกแแฏแแ แ แแแกแแฆแแแแก แแแแจแแแแแแแแก แแแแฎแแแ แแแแแก แแขแ แแแฃแขแแแแ Active Directory-แจแ แแ แแกแ แฃแแแแก แแแขแแ แแแแชแแแก แแแแแแจแแแแก แแแแแงแแแแแแ.
- sssd แแแแแแ แแแแแขแแแแ แแแแฌแแแแก แแแแฎแแแ แแแแแก แแแแแแขแแคแแแแชแแแก แฏแแฃแคแแก แฌแแแ แแแแก แกแแคแฃแซแแแแแ. แงแฃแ แแแฆแแแ! แแฃ แแก แแ แแ แแก แแแแคแแแฃแ แแ แแแฃแแ, แแแจแแ แแแแแแแก แแแแแกแแแแ แแแแฎแแแ แแแแแก แแฅแแแแ แฌแแแแแ แฐแแกแขแแ.
- แ แแแแกแแช แแฅแแแ แชแแแแแแ sudo-แก, sssd แแแแแแ แแซแแแก แ แแแแแก Active Directory-แจแ. แแฃ แ แแแแแ แแ แกแแแแแก, แแแแฎแแแ แแแแแก แแขแ แแแฃแขแแแ แแ แฏแแฃแคแแก แฌแแแ แแแ แแแฌแแแแแ (แแฃ sudoRoles แแแแคแแแฃแ แแ แแแฃแแแ แแแแฎแแแ แแแแแแ แฏแแฃแคแแแแก แแแแแกแแงแแแแแแแ)
แ แแแแฃแแ.
แแแ แแแแ, แแแกแแฆแแแแแ แแแแฎแแแ Active Directory แแแแฎแแแ แแแแแก แแขแ แแแฃแขแแแจแ, sudo แแแแแ แแแแแจแ - แแแแแแแแฃแ แแ, Linux แฐแแกแขแแแแ แฌแแแแแ แแแแแแแก แแแแแ แแจแแแแ แฎแแ แชแแแแแแแ Active Directory แฏแแฃแคแจแ แฌแแแ แแแแก แจแแแแฌแแแแแ.
แแแ แแแแ แแก แฎแแแแแขแแก แแแแ แขแแแฆแ - แแ แแแ แแแแ แแแขแแแแแงแแแ แ แกแแฉแฃแแแจแ แแงแแแแแ.
แฌแแ แแแแแแ แแแแแงแแแแแฃแแ แ แแกแฃแ แกแแแ:
แฌแงแแ แ: www.habr.com