{integration.helpText}
+
- The configuration settings below should only be modified by a super admin. Super
- admins can configure what tenant mode CIPP operates in. See
-
Tenant Mode
-
+ The configuration settings below should only be modified by a super admin. Super
+ admins can configure what tenant mode CIPP operates in. See
+
Tenant Mode
++ Listed below are the available API endpoints based on permission level, ReadWrite level + includes endpoints under Read. +
+ {[apiPermissions[cat][obj]].map((permissions, key) => { + var sections = Object.keys(permissions).map((type) => { + var items = [] + for (var api in permissions[type]) { + items.push({ heading: '', content: permissions[type][api] }) + } + return ( ++ Custom roles can be used to restrict permissions for users with the 'editor' or 'readonly' + roles in CIPP. They can be limited to a subset of tenants and API permissions. To restrict + direct API access, create a role with the name 'CIPP-API'. +
+
+
+ JIT Admin creates an account that is usable for a specific period of time. + Enter a username, select admin roles, date range and expiration action. +
+{row.Members}
:Role has no members.
} +{member}
) + ) : ( +Role has no members.
+ )} > ) @@ -53,6 +58,26 @@ const columns = [ exportSelector: 'Members', omit: true, }, + { + selector: (row) => row['Members'], + name: 'Assignments', + sortable: false, + cell: (row) => { + if (row.Members === 'none') { + return null + } + const memberCount = row.Members ? row.Members.split(',').length : 0 + const memberText = + row.Members && row.Members !== 'none' ? `Member${memberCount === 1 ? '' : 's'}` : null + return ( + <> + {memberCount} {memberText} + > + ) + }, + exportSelector: 'Members', + maxWidth: '150px', + }, { selector: (row) => 'View Members', name: 'Members', diff --git a/src/views/identity/administration/Users.jsx b/src/views/identity/administration/Users.jsx index 2d0a4aa9ac49..0b0ea525497e 100644 --- a/src/views/identity/administration/Users.jsx +++ b/src/views/identity/administration/Users.jsx @@ -111,6 +111,26 @@ const Offcanvas = (row, rowIndex, formatExtraData) => { modalUrl: `/api/ExecSendPush?TenantFilter=${tenant.defaultDomainName}&UserEmail=${row.userPrincipalName}`, modalMessage: 'Are you sure you want to send a MFA request?', }, + { + label: 'Set Per-User MFA', + color: 'info', + modal: true, + modalUrl: `/api/ExecPerUserMFA`, + modalType: 'POST', + modalBody: { + TenantFilter: tenant.defaultDomainName, + userId: `${row.userPrincipalName}`, + }, + modalMessage: 'Are you sure you want to set per-user MFA for these users?', + modalDropdown: { + url: '/MFAStates.json', + labelField: 'label', + valueField: 'value', + addedField: { + State: 'value', + }, + }, + }, { label: 'Convert to Shared Mailbox', color: 'info', @@ -273,7 +293,7 @@ const Offcanvas = (row, rowIndex, formatExtraData) => { label: 'Revoke all user sessions', color: 'danger', modal: true, - modalUrl: `/api/ExecRevokeSessions?TenantFilter=${tenant.defaultDomainName}&ID=${row.id}`, + modalUrl: `/api/ExecRevokeSessions?TenantFilter=${tenant.defaultDomainName}&ID=${row.id}&Username=${row.userPrincipalName}`, modalMessage: 'Are you sure you want to revoke this users sessions?', }, { @@ -447,11 +467,12 @@ const Users = (row) => { filterlist: [ { filterName: 'Enabled users', filter: '"accountEnabled":true' }, { filterName: 'Disabled users', filter: '"accountEnabled":false' }, - { filterName: 'AAD users', filter: '"onPremisesSyncEnabled":false' }, + { filterName: 'AAD users', filter: 'Complex: onPremisesSyncEnabled ne True' }, { filterName: 'Synced users', filter: '"onPremisesSyncEnabled":true', }, + { filterName: 'Non-guest users', filter: 'Complex: usertype ne Guest' }, { filterName: 'Guest users', filter: '"usertype":"guest"' }, { filterName: 'Users with a license', @@ -499,6 +520,26 @@ const Users = (row) => { modalUrl: `/api/ExecResetMFA?TenantFilter=!Tenant&ID=!id`, modalMessage: 'Are you sure you want to enable MFA for these users?', }, + { + label: 'Set Per-User MFA', + color: 'info', + modal: true, + modalUrl: `/api/ExecPerUserMFA`, + modalType: 'POST', + modalBody: { + TenantFilter: tenant.defaultDomainName, + userId: '!userPrincipalName', + }, + modalMessage: 'Are you sure you want to set per-user MFA for these users?', + modalDropdown: { + url: '/MFAStates.json', + labelField: 'label', + valueField: 'value', + addedField: { + State: 'value', + }, + }, + }, { label: 'Enable Online Archive', color: 'info', diff --git a/src/views/identity/reports/MFAReport.jsx b/src/views/identity/reports/MFAReport.jsx index 4f1d80936fa2..27f09aecfa3b 100644 --- a/src/views/identity/reports/MFAReport.jsx +++ b/src/views/identity/reports/MFAReport.jsx @@ -2,6 +2,7 @@ import React from 'react' import { useSelector } from 'react-redux' import { cellBooleanFormatter, CellTip } from 'src/components/tables' import { CippPageList } from 'src/components/layout' +import { Row } from 'react-bootstrap' const columns = [ { @@ -9,7 +10,8 @@ const columns = [ name: 'User Principal Name', sortable: true, exportSelector: 'UPN', - grow: 2, + cell: (row) => CellTip(row['UPN']), + maxWidth: '400px', }, { selector: (row) => row['AccountEnabled'], @@ -17,6 +19,7 @@ const columns = [ sortable: true, cell: cellBooleanFormatter({ colourless: true }), exportSelector: 'AccountEnabled', + maxWidth: '200px', }, { selector: (row) => row['isLicensed'], @@ -24,6 +27,7 @@ const columns = [ sortable: true, cell: cellBooleanFormatter({ colourless: true }), exportSelector: 'isLicensed', + maxWidth: '200px', }, { selector: (row) => row['MFARegistration'], @@ -31,13 +35,23 @@ const columns = [ sortable: true, cell: cellBooleanFormatter(), exportSelector: 'MFARegistration', + maxWidth: '200px', + }, + { + selector: (row) => row['PerUser'], + name: 'Per user MFA Status', + sortable: true, + cell: cellBooleanFormatter(), + exportSelector: 'PerUser', + maxWidth: '200px', }, { selector: (row) => row['CoveredBySD'], name: 'Enforced via Security Defaults', sortable: true, - cell: cellBooleanFormatter({ colourless: true }), + cell: cellBooleanFormatter(), exportSelector: 'CoveredBySD', + maxWidth: '200px', }, { selector: (row) => row['CoveredByCA'], @@ -46,12 +60,6 @@ const columns = [ cell: (row) => CellTip(row['CoveredByCA']), exportSelector: 'CoveredByCA', }, - { - selector: (row) => row['PerUser'], - name: 'Per user MFA Status', - sortable: true, - exportSelector: 'PerUser', - }, ] const Altcolumns = [ diff --git a/src/views/identity/reports/RiskDetections.jsx b/src/views/identity/reports/RiskDetections.jsx new file mode 100644 index 000000000000..ed1604acda6e --- /dev/null +++ b/src/views/identity/reports/RiskDetections.jsx @@ -0,0 +1,125 @@ +import { useSelector } from 'react-redux' +import { CippPageList } from 'src/components/layout' +import { CellTip } from 'src/components/tables' + +const columns = [ + { + name: 'Detected Date', + selector: (row) => row['detectedDateTime'], + sortable: true, + exportSelector: 'detectedDateTime', + }, + { + name: 'User Principal Name', + selector: (row) => row['userPrincipalName'], + sortable: true, + exportSelector: 'userPrincipalName', + }, + { + name: 'Location', + selector: (row) => `${row.location?.city} - ${row.location?.countryOrRegion}`, + sortable: true, + exportSelector: 'Location', + cell: (row) => CellTip(`${row.location?.city} - ${row.location?.countryOrRegion}`), + }, + { + name: 'IP Address', + selector: (row) => row['ipAddress'], + sortable: true, + exportSelector: 'ipAddress', + }, + { + name: 'Risk State', + selector: (row) => row['riskState'], + sortable: true, + exportSelector: 'riskState', + }, + { + name: 'Risk Detail', + selector: (row) => row['riskDetail'], + sortable: true, + exportSelector: 'riskDetail', + }, + { + name: 'Risk Level', + selector: (row) => row['riskLevel'], + sortable: true, + exportSelector: 'riskLevel', + }, + { + name: 'Risk Type', + selector: (row) => row['riskType'], + sortable: true, + exportSelector: 'riskType', + }, + { + name: 'Risk Event Type', + selector: (row) => row['riskEventType'], + sortable: true, + exportSelector: 'riskEventType', + }, + { + name: 'Detection Type', + selector: (row) => row['detectionTimingType'], + sortable: true, + exportSelector: 'detectionTimingType', + }, + { + name: 'Activity', + selector: (row) => row['activity'], + sortable: true, + exportSelector: 'activity', + }, +] + +const RiskDetections = () => { + const tenant = useSelector((state) => state.app.currentTenant) + + return ( + <> ++ CIPP will create 12 new groups in your Azure AD environment if they do not exist, + and add the CIPP user to these 12 groups. The CIPP user will be added to the + following groups: +
++ You have selected CIPP to manage your roles and groups. Invites will + contain the following roles and groups +
++ The invites have been generated. You can view the results below. The + invite link is to be used by a Global Administrator + of your clients Tenant. Theonboardinglink is to be + used by a CIPP administrator to finish the process inside of CIPP. +
+- {getNestedValue(graphrequest.data.Data[0], info.value)} -
- )} -+ {getNestedValue(graphrequest.data.Data[0], info.value)} +
+ )} +