PowerShell로 Microsoft 365 라이선스 최적화를 자동화하여 비용 낭비를 막는 방법
By Mirko Peters · · Updated
블로그에 다시 오신 것을 환영합니다. Microsoft 365 테넌트를 관리하신다면, 월말에 청구서를 열었을 때 가슴이 덜컥 내려앉는 기분을 아실 것입니다. 지난 회계연도 이후로 로그인한 적이 없는 사용자에게 할당된 활성 라이선스가 수십 개, 어쩌면 수백 개나 보입니다. 관리 센터를 수동으로 확인하는 작업은 일하는 느낌을 주지만, 오래된 계정, 위험한 공유, 대규모 라이선스 낭비를 번번이 놓치게 됩니다. 관리 센터를 가끔 확인하고 분기별 감사 때 불쾌한 상황을 마주하는 데 지쳤다면, 이제 워크플로에 자동화를 도입할 때입니다.
Automatically translated with AI from the original post. Read the English original
블로그에 다시 오신 것을 환영합니다. Microsoft 365 테넌트를 관리하신다면, 월말에 청구서를 열었을 때 가슴이 덜컥 내려앉는 기분을 아실 것입니다. 지난 회계연도 이후로 로그인한 적이 없는 사용자에게 할당된 활성 라이선스가 수십 개, 어쩌면 수백 개나 보입니다. 관리 센터를 수동으로 확인하는 작업은 일하는 느낌을 주지만, 오래된 계정, 위험한 공유, 대규모 라이선스 낭비를 번번이 놓치게 됩니다. 관리 센터를 가끔 확인하고 분기별 감사 때 불쾌한 상황을 마주하는 데 지쳤다면, 이제 워크플로에 자동화를 도입할 때입니다.
이번 글에서는 로그인 로그와 활성 라이선스를 교차 참조하는 예약 PowerShell 스크립트를 작성하는 방법을 자세히 살펴보겠습니다. 이 가이드를 마치면 사용되지 않는 SKU를 표시하고, 매월 불필요한 비용을 회수하며, 테넌트가 관리 부담으로 복잡해지는 것을 막는 방법을 이해하게 될 것입니다.
Microsoft 365 라이선스 최적화 소개
라이선스 최적화는 흔히 1년에 한 번 치르는 골칫거리로 여겨집니다. IT 관리자는 수동으로 내보내기 파일을 끌어모으고, 계약직 직원이 아직 근무 중인지 부서장에게 확인하며, 계정이 정말 버려진 것인지 짐작하느라 분주합니다. 이런 사후 대응 방식은 예산 낭비를 확실하게 보장합니다. 퇴사한 계약직 직원이나 회사를 떠난 직원이 E5 또는 Business Premium 라이선스를 계속 보유하고 있는 날마다 조직은 비용을 줄줄 흘리고 있는 셈입니다.
이를 해결하려면 라이선스 최적화를 지속적이고 자동화된 프로세스로 다뤄야 합니다. PowerShell과 Microsoft Graph의 힘을 활용하면 무거운 작업을 대신 처리하는 스크립트를 만들 수 있으며, 아침 커피가 다 내려지기 전에 실행 가능한 데이터를 확보할 수 있습니다.
수동 포털 확인이 부족한 이유
기본 제공되는 Microsoft 365 관리 센터에만 의존하면 안 되는 이유가 무엇일까요? 포털은 심층적인 거버넌스보다 편의성을 위해 설계되었습니다. 웹 인터페이스에 로그인하면 과거 맥락 없이 특정 시점의 스냅샷을 보게 됩니다. 포털에서는 수천 명의 사용자에 대해 마지막 로그인 날짜를 특정 라이선스 SKU와 한 화면에서 쉽게 교차 참조하여 보기 어렵습니다.
게다가 수동 확인은 전적으로 사람의 기억에 의존합니다. 서비스 계정을 확인하는 것을 기억하셨나요? 그 공유 사서함에 실제로 Exchange Online Plan 2 라이선스가 필요한지 확인하셨나요? 사람이 하는 실수는 사각지대를 만들고, 그 사각지대는 비용을 발생시키고 보안 위험을 초래합니다.
적합한 PowerShell 모듈과 범위 선택하기
스크립트 로직을 한 줄이라도 작성하기 전에 도구를 갖추어야 합니다. Microsoft의 PowerShell 생태계는 발전해 왔으며, 레거시 모듈에 계속 의존하면 사용 중단 경고와 깨진 스크립트만 얻게 됩니다. 핵심 도구 모음에는 다음이 포함되어야 합니다.
- Microsoft Graph PowerShell: 사용자, 그룹 및 디렉터리 개체를 관리하기 위한 최신 표준입니다.
- ExchangeOnlineManagement: 사서함, 전달 규칙 및 공유 사서함 라이선스를 감사하는 데 필수적입니다.
- PnP.PowerShell: SharePoint 사이트, 게스트 링크 및 외부 공유 확산을 검토하는 데 중요합니다.
스크립트에 권한을 부여할 때는 반드시 최소 권한 원칙을 적용하십시오. 자동화 스크립트에 전역 관리자 자격 증명을 절대 사용하지 마십시오.
주간 읽기 전용 감사 보고서 정의하기
IT 자동화의 황금률은 간단합니다. 읽기 전용을 우선하십시오. 사용자를 자동으로 삭제하거나 라이선스를 회수하는 스크립트로 자동화 여정을 시작하지 마십시오. 첫 번째 버전은 전적으로 데이터 수집에 초점을 맞춰야 합니다.
포괄적인 읽기 전용 감사를 실행하는 주간 일정을 설정하십시오. 이 감사에서는 비활성 사용자, 게스트 액세스 목록, 라이선스 할당과 실제 로그인 활동의 비교, 사서함 구성, 그리고 소유자가 없는 Microsoft 365 그룹을 평가해야 합니다. 주간 주기를 확립하면 혼란스러운 긴급 대응을 자동 생성된 깔끔한 보고서를 10분간 검토하는 방식으로 대체할 수 있습니다.
로그인 로그와 활성 라이선스 교차 참조하기
라이선스 최적화의 핵심 비결은 교차 참조입니다. 사용자 계정에 할당된 라이선스는 그 사용자가 90일 동안 인증하지 않았다면 의미가 없습니다. 스크립트는 Microsoft Entra ID에서 두 가지 주요 데이터 세트를 가져와야 합니다.
- 사용자에게 할당된 라이선스 SKU입니다.
- 사용자의 마지막 로그인 날짜(대화형 및 비대화형)입니다.
이 두 가지 데이터를 PowerShell 객체로 결합하면 라이선스 낭비를 즉시 계산할 수 있습니다. 사용자의 마지막 로그인이 정해진 기준(예: 60일 또는 90일)을 초과하면, 스크립트는 해당 계정을 라이선스 회수 대상으로 표시합니다.
보고서 전달 자동화 및 결과물 저장
로컬 디렉터리에 조용히 쌓여 있는 보고서는 아무 쓸모가 없습니다. 조치를 취할 수 있는 사람에게 결과를 직접 전달해야 합니다. 스크립트가 구조화된 CSV 파일과 간결한 HTML 요약을 생성하도록 구성하십시오.
그다음 스크립트가 요약을 IT 거버넌스 배포 목록으로 이메일 발송하거나, 웹훅을 통해 전용 Microsoft Teams 채널에 직접 게시하도록 하십시오. 또한 원본 CSV 결과물은 보안이 적용된 거버넌스 SharePoint 문서 라이브러리에 저장하여 규정 준수를 위한 이력 기록을 유지하십시오.
Azure Automation과 작업 스케줄러로 안전하게 예약하기
이 스크립트는 어디에 두어야 할까요? 보안 자격 증명 저장소를 사용하여 작업 스케줄러를 통해 로컬 컴퓨터나 Windows Server에서 실행할 수도 있지만, 엔터프라이즈 수준의 방식은 Azure Automation을 사용하는 것입니다.
스크립트를 Azure Automation 런북으로 배포하고 관리 ID로 인증하면, 하드코딩된 암호나 만료된 서비스 주체 비밀에 따른 위험을 없앨 수 있습니다. Azure Automation은 실행 환경, 로깅, 오류 처리를 클라우드에서 원활하게 처리합니다.
안전 및 규정 준수 가드레일 구현
가드레일 없는 자동화는 언젠가 큰 사고로 이어질 수 있습니다. 테넌트를 보호하려면 자동화 파이프라인에 다음 보호 장치를 구축하십시오:
- 상세 로깅: 상관 관계 ID와 함께 스크립트 실행의 모든 단계를 기록하십시오.
- Try/Catch 블록: 조절(스로틀링), 네트워크 시간 초과, 권한 오류를 적절히 처리하고, 실행이 실패하면 공유 사서함으로 경고를 보내십시오.
- 보류 작업 대기열: 라이선스를 자동으로 제거하는 대신, 영향이 큰 작업은 먼저 "보류" 대기열이나 승인 워크플로를 거치도록 하십시오.
단계별 해결 전략 수립
첫날부터 모든 것을 자동화하려고 하지 마십시오. 다음과 같이 명확한 단계로 해결 전략을 도입하십시오:
- 1~2주 차: 보고서만 생성합니다. 데이터를 수집하고, 오탐을 검토하며, 예외 목록을 조정하십시오.
- 3~4주 차: 가벼운 조치를 시작합니다. 오래된 게스트 링크의 만료 처리를 시작하고, 수동 승인이 필요한 라이선스 제거 권고를 표시하십시오.
- 지속적으로: 위험이 낮은 항목은 자동화하되, 삭제와 같이 파괴적인 변경에는 사람의 승인 게이트를 유지하십시오.
흔히 겪는 PowerShell 자동화 함정 해결하기
아무리 좋은 스크립트라도 예상치 못한 문제를 만날 수 있습니다. 결과가 비어 있다면 Graph 권한과 모듈 버전을 다시 확인하고, Graph Explorer에서 쿼리를 테스트하여 문제를 분리하십시오. 간헐적으로 실패한다면 스크립트가 스로틀링 한도에 걸리고 있을 가능성이 큽니다. 지수 백오프와 재시도 로직을 구현하여 실행이 안정적으로 이루어지도록 하십시오. 마지막으로, 서비스 계정과 비상 액세스(브레이크 글래스) 계정을 충실하게 관리하는 허용 목록을 유지하여 오탐을 방지하십시오.
자주 묻는 질문
자동화가 테넌트를 망가뜨리지는 않을까요?
읽기 전용으로 시작하고, 승인 절차를 추가하며, 자동화 계정에 부여하는 권한을 엄격히 제한한다면 그렇지 않습니다.
지금 Graph PowerShell이 필요한가요?
네, 현대적인 방향입니다. Exchange Online 및 PnP 모듈과 함께 사용하여 모든 관리 영역을 다루십시오.
ROI는 얼마나 빨리 확인할 수 있나요?
첫 주간 실행에서 사용되지 않는 라이선스와 오래된 게스트 계정이 상당량 드러나는 경우가 일반적이며, 이는 즉각적인 비용 절감 기회가 됩니다.
다중 지역(Multi-Geo)이나 MSP 환경은 어떻게 하나요?
테넌트 구성을 매개 변수화하고, 로깅 인프라를 중앙 집중화하며, 출력 보고서에 테넌트 ID 태그를 지정하여 여러 환경으로 확장하십시오.
결론
Microsoft 365 라이선스 최적화를 자동화하는 것은 관리자가 추진할 수 있는 가장 레버리지가 큰 프로젝트 중 하나입니다. 낭비되는 소프트웨어 비용이 매달 새어 나가는 것을 막고, 오래된 계정을 정리하여 보안 태세를 강화하며, 번거로운 수동 포털 점검에서 해방시켜 줍니다.
라이브 스크립트 분석과 더 깊은 아키텍처 팁을 포함한 이 개념들의 전체 설명을 듣고 싶다면 관련 팟캐스트 에피소드를 꼭 확인하십시오: Automate Microsoft 365 Tenant Cleanup with PowerShell. 오늘 바로 자동화 실력을 한 단계 끌어올려 보세요!