데스크탑 응용 프로그램에 '관리자 암호'를 제공 할 수있는 대안은 무엇입니까?


10

저는 현재 회사에서 10 년 넘게 사용 된 소프트웨어를 관리하고 리팩토링하고 있습니다. 이 응용 프로그램의 요소 중 하나는 일종의 관리자 또는 고급 사용자 모드로, 일부 추가 / 내부 입력과 입력 제한을 해제하는 기능을 제공합니다.

역사적으로이 모드는 Windows 시스템 디렉토리의 특정 위치 (응용 프로그램으로 하드 코딩 된 파일)에 특정 이름의 파일을 배치하여 설정되었습니다. 파일은 비어 있지만 'something.DLL'이라는 dll이 아닌 ASCII 파일.

그래서 최근에 사용자가 관리자 암호를 입력하여이 기능을 켤 수 있도록 몇 가지 코드와 작은 모달 형식을 추가했습니다. 사용자 비밀번호가 아닌 설정된 비밀번호입니다. 올바른 암호를 입력하면 응용 프로그램 루트 디렉토리에 '키 파일'을 만들어 해당 파일이있는 경우 프로그램이 관리 모드에서 시작할 수 있도록 동일한 암호를 입력합니다.

이제이 소프트웨어를 주로 담당하는 부서 관리자는 그 아이디어를 좋아하지 않습니다. 그는 우리가 간단하고 사전 설정된 비밀번호를 가지고 있다면 쉽게 '나갈'수 있으며 경험이없는 사용자가 그러한 추가 기능에 액세스하는 것을 원하지 않는다고 생각합니다.

그래서 제 질문은 좀 더 안전한 이런 종류의 액세스를 제공하기위한 다른 방법은 무엇입니까? 이 소프트웨어를 유지 보수하고 관리하는 데있어 거의 나에 불과하기 때문에 거의 완전히 내장되거나 자동화되지 않은 것은 도움이되지 않을 것입니다 (예 : '라이센스 키'또는 이와 유사한 것).

참고 :이 응용 프로그램은 VB.NET (.NET 4.0)으로 작성되었으며 현재 새 버전이 완료되면 클릭 원스 배포를 사용할 계획입니다.


1
어떤 사용자는 "경험이없는"사용자와 그렇지 않은 사용자를 결정해야합니다. 누가 그 결정을 내립니까? 누가 그 결정을 시스템에 넣어야합니까?
Doc Brown

답변:


13

Active Directory가있는 경우 Active Directory 그룹의 구성원 자격을 테스트 할 수 있습니다.

public bool IsInADGroup(string ADGroupName)
    {
        bool result = false;
        List<string> myGroups = new List<string>();

        using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, SystemInformation.UserDomainName))
        {
            using (PrincipalSearchResult<Principal> src = UserPrincipal.FindByIdentity(pc, SystemInformation.UserName).GetGroups(pc))
            {
                src.ToList().ForEach(sr => myGroups.Add(sr.SamAccountName));
            }
        }
        result = myGroups.Contains(ADGroupName);
        return result;
    }

이것은 매우 좋은 답변이며,이 프로젝트와 다른 프로젝트에서 반드시 명심해야 할 것입니다. 그러나 실제 문제는 회사 외부의이 프로그램 사용자입니다. 우리는 자매 회사 및 외부의 외부 제 3 자 사용자 모두에게 제공합니다. 실제로이 시점에서 네트워크 외부 사용자를 위해 이러한 기능을 완전히 비활성화하고 제안을 내부 목적으로 사용하는 것이 가장 좋습니다.
Anthony

5

관리자가 암호를 알아내는 것에 대한 권리 입니다. 그것은 문제가 아니라 언제입니다.

Active Directory는 일부 사용자에게는 옵션이 아니므로 수퍼 유저 액세스가 허용되는 Windows 로그인 이름 목록을 사용하여 서명 된 텍스트 파일을 만들 수 있습니다 . 이것은 사람들이 컴퓨터 나 로그인을 공유하고 있지 않다고 가정합니다.

사용자 이름은 응용 프로그램의 폴더에 넣을 수 있도록 쉽게 배포 된 텍스트 파일로 들어갑니다. 중요한 부분은 사용자 이름 목록에 서명하는 것입니다. 매우 간단하게 유지하십시오. 행당 하나의 사용자 이름으로 마지막 줄에 해시를 넣습니다. 프로그램 바이너리에 일종의 비밀 키를 포함시키고 사용자 이름으로 해시하십시오. 비밀 키는 사람들이 파일을 수정 한 다음 해시 자체를 계산하지 못하게합니다 (아마도 처음부터 가져옵니다).

UserName1
UserName2
.
.
.
UserName34
<HashOfUserNamesAndSecretKey>

물론 권한이있는 사용자 목록의 관리자 역할을하는 사람이 필요합니다. 관리자는 파일과 해시를 생성하는 프로그램 (사용자가 작성했습니다!)이 있어야합니다. 다른 것이 없다면 사용자 이름의 텍스트 파일을 가져 와서 해시를 추가 할 수 있습니다.

철저한 액세스를 위해 액세스가 취소 된 사람은 여전히 ​​로그인 이름이있는 파일의 사본을 가져올 수 있습니다. 액세스를 원할 때마다 사본을 제자리에 놓을 수있었습니다. 그래도 걱정할 것이 없습니다.


3

Active Directory는 옵션이 아니므로 현재 날짜를 해시합니다. 엔트로피가 가장 높은 요소 (첫 번째 날)와 엔트로피가 가장 적은 요소 (년)를 사용하십시오. 필요한 경우 도메인 별 솔트 (회사 외부에서 사용되므로 고객 ID, 회사 이름 등)를 추가하십시오. 이렇게하면 최종 사용자가 추측 할 수없는 매일 매우 다른 암호를 생성해야하며 소프트웨어를 사용하는 회사마다 다를 수 있습니다.

소프트웨어가 집에 전화하지 않고 사용자를 인증 할 수 있어야하기 때문에 이것은 본질적으로 닭고기와 달걀 문제입니다. 따라서 모호한 크래킹 메커니즘을 사용하여 알을 만드십시오. 모호함을 통한 보안은 실제 보안이 아니지만 문제의 매개 변수를 부여한 것이 가장 좋습니다.

이것은 텍스트 파일을 어딘가에 두는 것보다 낫습니다. 일단 비밀이 밝혀지면 게임이 끝나기 때문에 정적 암호보다 낫지 않습니다.


0

액세스 제어 목록을 사용하십시오 .

이를 수행하는 빠르고 더러운 방법은 응용 프로그램 디렉토리에서 모든 권한 (읽기 권한 포함)을 제거한 다음 응용 프로그램을 실행할 수있는 모든 사용자에 대해 이러한 권한을 추가하는 것입니다. 물론 권한이있는 사용자는 응용 프로그램 디렉토리를 공용 위치에 쉽게 복사 할 수 있지만 실수로 발생하지는 않지만 암호 공유는 실수로 쉽게 발생할 수 있습니다.

물론 이것은 관련된 컴퓨터가 보안되어 있다고 가정합니다 (활성 디렉토리로).


관련된 컴퓨터가 Active Directory로 보호되는 경우 보안 그룹 구성원 자격으로 고급 기능을 보호하는 것이 가장 좋습니다. 필요에 따라 사용자를 그룹에 추가 할 수 있으며 파일 시스템 권한은 관련이 없습니다.
Kevin

@ 케빈 : 동의합니다. 나는 Dan 's Answer 가 그것을 커버 한다고 생각 합니다.
Brian

0

내 선호는 @ Dan이 제안한대로-활성 디렉토리를 사용하십시오. 이것이 가능하지 않으면 시간을 기반으로 한 비밀번호 생성기가 유용 할 수 있습니다. 비슷한 상황에서 (매우 먼 과거) 우리 회사에서 근무한 회사는 9999-MMDD를 사용했습니다. 이것은 몇 년 후에 나왔습니다. hhmm에 던지고 조금 섞어 놓으면 누군가 고양이가 가방을 꺼내기 전에 1 ~ 2 년이 걸릴 수 있습니다.

비슷하지만 복잡한 전략을 사용하여 암호를 생성하는 프로그램을 항상 작성할 수 있습니다. 사용 된 이름에도 기계 이름을 입력하십시오. 관리자는 해당 프로그램을 실행하여 해당 시스템의 현재 비밀번호를 얻을 수 있습니다. 다른 기계에 복사하거나 다른 사용자가 로그인 한 경우 유효하지 않도록 일부 정보를 파일에 저장하십시오. 그런 다음 프로그램을 안전하게 유지하고 고양이가 빠져 나오면 결함이 있습니다.

이 체계는 키프 토 관점에서 약하고 신뢰할 수없는 것으로 간주되지만 문제에 적합합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.